多態性不僅對派生類很重要,對基類也很重要。任何情況下,使用基類實際上都可能是在使用已強制轉換爲基類類型的派生類對象。
當派生類從基類繼承時,它會獲得基類的所有方法、字段、屬性和事件。面向對象的語言使用虛方法表達多態。
若要更改基類的數據和行爲,您有兩種選擇:可以使用新的派生成員替換基成員,或者可以重寫虛擬的基成員。
使用新的派生成員替換基類的成員需要使用 new 關鍵字。如果基類定義了一個方法、字段或屬性,則 new 關鍵字用於在派生類中創建該方法、字段或屬性的新定義。new 關鍵字放置在要替換的類成員的返回類型之前
使用 new 關鍵字時,調用的是新的類成員而不是已被替換的基類成員
class Gun
{
//瞄準
public void Loaded() {
Console.WriteLine("開槍前要瞄準!");
}
//開槍
public virtual void Fire() {
Console.WriteLine("嘣!!");
}
}
class AK47 : Gun
{
public new void Loaded() {
Console.WriteLine("AK47還需要瞄準?");
}
//重寫父類中的開槍的方法
public override void Fire()
{
Console.WriteLine("Ak47,噠噠噠噠噠噠....");
}
}
class M16 : Gun {
public override void Fire()
{
Console.WriteLine("M16,啪啪啪啪....");
}
}
字段不能是虛擬的,只有方法、屬性、事件和索引器纔可以是虛擬的。當派生類重寫某個虛擬成員時,即使該派生類的實例被當作基類的實例訪問,也會調用該成員
使用虛擬方法和屬性可以預先計劃未來的擴展。由於在調用虛擬成員時不考慮調用方正在使用的類型,所以派生類可以選擇完全更改基類的外觀行爲。
無論在派生類和最初聲明虛擬成員的類之間已聲明瞭多少個類,虛擬成員都將永遠爲虛擬成員。如果類 A 聲明瞭一個虛擬成員,類 B 從 A 派生,類 C 從類 B 派生,則類 C 繼承該虛擬成員,並且可以選擇重寫它,而不管類 B 是否爲該成員聲明瞭重寫。
派生類可以通過將重寫聲明爲密封的來停止虛擬繼承。這需要在類成員聲明中將 sealed 關鍵字放在 override 關鍵字的前面
建議虛擬成員在它們自己的實現中使用 base 來調用該成員的基類實現。允許基類行爲發生使得派生類能夠集中精力實現特定於派生類的行爲。未調用基類實現時,由派生類負責使它們的行爲與基類的行爲兼容。
public virtual void AttackMethod() {
Console.WriteLine("英雄{0}攻擊了一次",this.h_name);
}
}
class ADC : Hero {
public override void AttackMethod()
{
base.AttackMethod();
Console.WriteLine("英雄{0}使用萬箭齊發技能",this.h_name);
Console.WriteLine("射手觸發了暴擊被動!");
}
}