只有基類成員聲明爲virtual或abstract時,才能被派生類重寫;而若是子類想改變虛方法的實現行爲,則必須使用override關鍵字。c#
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關鍵字對基類方法進行重寫。這樣,每一個基類在調ide
用相同的方法時將表現出不一樣的行爲,這段代碼正是c#中多態的實現。spa
若子類還想繼續訪問基類定義的方法,則可使用Base關鍵字來完成調用。code
如圖運行結果能夠看出,相同類型的對象調用相同的方法確實表現了不一樣的行爲,這就是多態的精髓所在。對象
可是,上面的代碼還存在一個問題;咱們能夠經過new操做符建立Animal基類的實例,可Animal基類的做用是爲全部子類提供公共成員,它是一個blog
抽象的概念,在實際的系統中咱們但願能避免建立該類的實例。該怎麼作?get
對應c#,可使用abstract關鍵字來防止在代碼中直接建立這樣的類的實例,以下:string
public abstract class Animal { ..... }
醬紫 ,若嘗試建立Animal實例,就會收到以下所示報錯。it