菜雞與物件導向 (6): 抽象、覆寫
備註:這邊的抽象是指程式語言中的抽象類別,而非抽象化
抽象的概念很直接,請回想一下前面的例子就可以了:
當我們在用卡牌的例子時,雖然怪獸卡跟魔法卡都繼承了 Card 這個類別,但是我們仍然能
new Card()
來建立一張新卡牌,那…怪怪的吧,這張卡牌到底是什麼呀,空白的卡片嗎?
又或是動物的例子,我們的狗跟貓都繼承了哺乳類,那我們能實例化一個哺乳類嗎?我們的狗跟鳥都是動物,那我們能實例化一個動物嗎?
小明跟小華都繼承了工程師,那我們能 new 一個工程師嗎…?
有些類別就是這樣,它們負責定義共通的那些特性,然而它們本身不應該被實體化成一個物件,這種類別我們就應該把它們標記為抽象類別。
抽象類別在 C# 裡用 abstract
這個修飾詞來表示,可以加在類別或方法上。例如 abstract class Animal
就代表動物這個類別是個抽象類別,它不能被實例化。
而當加在方法上時,例如 public abstract void Eat()
就是代表這個進食的方法無法被叫用,只能由繼承者去重新定義這個方法。
abstract class Animal
{
public string color { get; set; }
public abstract void Eat();
}
那麼繼承者們,也就是衍生類別如何去重新定義父類別的方法呢?
所謂「欲戴王冠,必 Override」,這時候就必須使用覆寫(override
)。
覆寫是指對於像是前述的抽象方法時,在同名的方法前加上 override
關鍵字就可以讓程式知道你要覆寫這個方法(你不覆寫的話,編譯器還會生氣)。
例如前述的 Eat,狗就可以用 public override void Eat()
的方式去覆寫吃東西這個方法:
public class Dog : Animal
{
public string color { get; set; } = "Black";
public override void Eat()
{
/* 嚼嚼嚼 */
}
}