只有基類成員聲明為virtual或abstract時,才能被派生類重寫;而如果子類想改變虛方法的實現行為,則必須使用override關鍵字。
public class Animal { private int _age; public int Age { get { return _age; } set { //這里假設牛的壽命為10年。 if(value <0 ||value >10) { throw (new ArgumentOutOfRangeException("AgeIntPropery", value, "年齡必須在0-10之間")); } _age = value; } } //幾乎所有動物都具備發出聲音的能力 /// <summary> /// 但是對於動物來說,每個動物發出的聲音都不一樣 /// </summary> public virtual void Voice() { Console.WriteLine("動物開始發出聲音"); } //馬(子類) public class Horse:Animal { //通過override關鍵字來重寫父類方法 public override void Voice() { base.Voice(); Console.WriteLine("馬兒發出嘟...嘟....嘟....的聲音"); } } //羊 (子類) public class Sheep:Animal { public override void Voice() {
//調用基類方法 base.Voice(); Console.WriteLine("羊發出咩...咩...咩...的聲音"); } }
static void Main(string[] args) { Animal horse = new Horse(); horse.Voice(); Animal sheep = new Sheep(); //相同類型的對象調用相同的方法表現出不同的行為 sheep.Voice(); Console.Read(); }
通過使用virtual關鍵字,把需要在子類中表現為不同行為的方法定義為虛方法,然后在子類中使用override關鍵字對基類方法進行重寫。這樣,每個基類在調
用相同的方法時將表現出不同的行為,這段代碼正是c#中多態的實現。
若子類還想繼續訪問基類定義的方法,則可以使用Base關鍵字來完成調用。

如圖運行結果可以看出,相同類型的對象調用相同的方法確實表現了不同的行為,這就是多態的精髓所在。
但是,上面的代碼還存在一個問題;我們可以通過new操作符創建Animal基類的實例,可Animal基類的作用是為所有子類提供公共成員,它是一個
抽象的概念,在實際的系統中我們希望能避免創建該類的實例。該怎么做?
對應c#,可以使用abstract關鍵字來防止在代碼中直接創建這樣的類的實例,如下:
public abstract class Animal { ..... }
醬紫 ,若嘗試創建Animal實例,就會收到如下所示報錯。
