Object Interfaces and Inheriatance

介面和繼承

繼承(Inheritance)

類別可宣告成三種型式

  • static - 無法被實例化,應用程式Run起來,就會存在
    • static class MyClass { }
  • abstract - 無法被實例化,是一個未完成的class
    • abstract class MyClass { }
  • sealed - 無法被繼承的類別
    • sealed class MyClass { }

 

繼承階層範例

class MyClass1 
{
    public string Name { get; set; }
}

class MyClass2 : MyClass1
{
    public int Age { get; set; }
}

class MyClass3 : MyClass2
{
    public string Address { get; set; }
}

根據此階層關係MyClass3會有三個屬性

  • Name
  • Age
  • Address

 

虛擬方法(Virtual Methods)

說明:一個已經有實作方法,而且可以被衍生類別覆寫(override)

Demo - 了解 virtual, override and new

說明:Demo有四個類別,其中一個是BaseClass,另外三個類別會繼承BaseClass,並寫用不同的方式,重寫BaseClass.Hello()的方法。

class BaseClass
{
    public virtual void Hello() 
    {
        Console.WriteLine("BaseClass Say Hello");
    }
}

class DerivedOverrideClass : BaseClass
{
    // 使用 override 語句
    public override void Hello()
    {
        Console.WriteLine("DerivedOverrideClass Say Hello");
    }

}

class DerivedNewClass : BaseClass
{
    // 使用 new 語句
    public new void Hello() 
    {
        Console.WriteLine("DerivedNewClass Say Hello");
    }
}

class DerivedOverwrite : BaseClass
{
    // 與BaseClass 同名
    public void Hello()
    {
        Console.WriteLine("DerivedOverwrite Say Hello");
    }
}
static void Main(string[] args)
{
    var baseClass = new BaseClass();
    var derivedOverride = new DerivedOverrideClass();
    var derivedNew = new DerivedNewClass();
    var derivedOverWrite = new DerivedOverwrite();

    baseClass.Hello();          // output : BaseClass Say Hello
    derivedOverride.Hello();    // output : DerivedOverrideClass Say Hello
    derivedNew.Hello();         // output : DerivedNewClass Say Hello
    derivedOverWrite.Hello();   // output : DerivedOverwrite Say Hello

    // 將衍生類別轉型回BaseClass的結果
    ((BaseClass)derivedOverride).Hello();   // output : DerivedOverrideClass Say Hello
    ((BaseClass)derivedNew).Hello();        // output : BaseClass Say Hello
    ((BaseClass)derivedOverWrite).Hello();  // output : BaseClass Say Hello          
}
從結論來看只有override,還會保留衍生類別的方法,而其他兩種衍生類別的方法都會消失,執行BaseClass的方法。

 

 

 

物件實體化

當一個類別被new起來的時候,建構式會被執行,而父類別建構式,會先執行,以下範例

static void Main(string[] args)
{
    MyClass3 c = new MyClass3("Miles", 18 , "Taipei");
}

 


class MyClass1 
{
    // 建構式,最先呼叫
    public MyClass1(string name)
    {
        this.Name = name;
    }
    public string Name { get; set; }
}

class MyClass2 : MyClass1
{
    // 建構式,次先呼叫
    public MyClass2(string name, int age)
        : base(name)
    {
        this.Age = age;
    }
    public int Age { get; set; }
}

class MyClass3 : MyClass2
{
    // 建構式,最後才執行此建構式
    public MyClass3(string name, int age, string address)
        : base(name, age)
    {
        this.Address = address;
    }
    public string Address { get; set; }
}

 

 

介面(interface)

介面裡面會有定義的方法,類別需要實作介面定義的方法,而一個類別可實作多個介面。
 

public class Computer : IDateOperater, ISerialization
{
    public void Save()
    {
        throw new NotImplementedException();
    }

    public void Serialized()
    {
        throw new NotImplementedException();
    }
}

public interface IDateOperater
{
    public void Save();
}

public interface ISerialization
{
    public void Serialized();
}

以上為有關繼承的基本介紹。

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。