標籤:
1.抽象成員必須標記為abstract,並且不能有任何實現。
2.抽象成員必須在抽象類別中。
3.抽象類別不能被執行個體化
4.子類繼承抽象類別後,必須把父類中的所有抽象成員都重寫。
(除非子類也是一個抽象類別,則可以不重寫)
5.抽象成員的存取修飾詞不能是private
6.在抽象類別中可以包含執行個體成員。
並且抽象類別的執行個體成員可以不被子類實現
7.抽象類別是有建構函式的。雖然不能被執行個體化。
8、如果父類的抽象方法中有參數,那麼。繼承這個抽象父類的子類在重寫父類的方法的時候必須傳入對應的參數。
如果抽象父類的抽象方法中有傳回值,那麼子類在重寫這個抽象方法的時候 也必須要傳入傳回值。
class Class1 { static void Main(string[] args) { //抽象類別和介面不允許執行個體化,但允許裝入子類 //父類裡裝的是子類,但是表現出來的是父類,調用的還是父類成員, //但父類是抽像類,方法被子類成員重寫,所以調用出來的是子類方法 Animal an = new MaoMi(); an.Jiao(); Animal xg = new XiaoGou(); xg.Jiao(); xg.jj(); Console.ReadKey(); } } //使用 abstract 聲明一個抽象類別 ,類似於介面,抽象類別多定義於使用規範,在多人協同編寫中代碼調用類方法一式 public abstract class Animal { //抽像方法 public abstract void Jiao(); private string _name; //抽像屬性 public abstract string Name { get; set; } public Animal(int age) { this.Name = _name; } public Animal() { } public void jj() { Console.Write("這裡是執行個體化子類後,可以調用的"); } } //聲明一個子類 public class MaoMi:Animal { public override void Jiao() { Console.WriteLine("小貓喵喵叫"); } public override string Name { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } } //聲明一個子類 public class XiaoGou : Animal { public override void Jiao() { Console.WriteLine("小狗汪汪叫"); } public override string Name { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } }
======
如果父類中的方法有預設的實現,並且父類需要被執行個體化,這時可以考慮將父類定義成一個普通類,用虛方法來實現多態。
如果父類中的方法沒有預設實現,父類也不需要被執行個體化,則可以將該類定義為抽象類別。
C#抽象類別