一、abstractide
·抽象方法就是沒有實現的,必須是形如:
public abstract void Init();函數
·擁有抽象方法的類必須修飾一個abstract關鍵字從而變成一個抽象類;可是反過來,抽象類裏面不必定要有抽象方法,好比我寫了一個非抽象類,可是這個類我不想讓人直接實例 化,而只讓人繼承,我就能夠把他變成一個抽象類,雖然他裏面並無抽象方法。形如:
abstract class TestAbstractSuperui
·抽象類不能被實例化,只能被繼承。this
·抽象類的子類必須實現每一個抽象方法。spa
·抽象類裏面除了能夠有抽象方法之外,也能夠有普通的方法。code
·抽象類的構造函數能夠省略,編譯器會自動加上,可是不能是一個抽象方法,而只能是一個普通的構造函數。blog
抽象類是不能被實例化的,但抽象類能夠有構造函數。抽象類的構造函數用來初始化抽象類的一些字段,而這一切都在抽象類的派生類實例化以前發生。不只如此,抽線類的構造函數還有一種巧妙應用:就是在其內部實現子類必須執行的代碼。如下就是在抽象類的構造函數中來初始化字段。繼承
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Employee employee = new Employee(); 6 Console.WriteLine(employee.ID); 7 Console.ReadKey(); 8 } 9 } 10 11 public abstract class Base 12 { 13 private Guid _id; 14 15 public Base() 16 { 17 this._id = Guid.NewGuid(); 18 } 19 20 public Guid ID 21 { 22 get { return this._id; } 23 } 24 } 25 26 public class Employee : Base 27 { 28 29 }
小結:簡單歸納一下,抽象類不能夠直接實例化,他能夠有n個(n>=0)抽象方法,這些抽象方法子類必須實現。get
virtual:編譯器
一、聲明瞭virtual的方法無需去改動類的聲明,他只在此方法上起到影響。
二、只有virtual的方法能夠被子類override。
三、子類能夠不ouverride父類的virtual方法,這種狀況下他就像普通的父類方法同樣。
小結:簡單歸納一下,virtual關鍵字就是告訴子類,此方法能夠被override,但非強制。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace TestAppAllHere { abstract class TestAbstractSuper { public TestAbstractSuper() { Debug.WriteLine("這是父類的構造方法"); } public abstract void Init(); public void Hello() { Debug.WriteLine("這是父類的非抽象方法"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace TestAppAllHere { class TestAbstractSub:TestAbstractSuper { public TestAbstractSub() { Debug.WriteLine("這是子類的構造方法"); } //___________________沒有重寫這個虛擬方法也是能夠照常運行的,會調用父類的虛擬方法_________________________
//___________________重寫了以後父類的虛擬方法不會運行,而是重寫,固然能夠用base.來調用父類的方法__________ public override void Init() { Debug.WriteLine("這是子類重寫的方法"); } } }
調用
<span style="white-space:pre"> </span> TestAbstractSub sub = new TestAbstractSub(); sub.Init(); sub.Hello();
輸出:
這是父類的構造方法 這是子類的構造方法 這是子類重寫的方法 這是父類的非抽象方法