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(); } } }
======
如果父類中的方法有默認的實現,並且父類需要被實例化,這時可以考慮將父類定義成一個普通類,用虛方法來實現多態。
如果父類中的方法沒有默認實現,父類也不需要被實例化,則可以將該類定義為抽象類。
