語法上允許,但語義矛盾,實際開發中應避免。
override:表示**重寫**基類的虛方法,提供具體實現abstract:表示**無實現**,強制派生類必須重寫public abstract override void MyMethod(); // 語法合法
這聲明的意思是:「我重寫了基類方法,但不提供實現,強制子類再重寫一次」。這在邏輯上是多餘的——直接在基類聲明 `abstract` 即可達到相同效果,中間層的 `override abstract` 只增加了複雜度。
// 基類
public abstract class Animal {
public abstract void MakeSound();
}
// 中間類:不提供實現,直接繼承抽象方法
public abstract class Mammal : Animal {
// 這裡不需要 override abstract,直接繼承即可
// 子類必須實現 MakeSound
}
// 具體類
public class Dog : Mammal {
public override void MakeSound() => Console.WriteLine("Woof");
}
public abstract class Animal {
public virtual void Breathe() => Console.WriteLine("Breathing...");
}
public class Mammal : Animal {
public override void Breathe() { // 正常 override,提供新實現
Console.WriteLine("Mammal breathing");
}
}
public class Base {
public virtual void Do() => Console.WriteLine("Base");
}
public class Derived : Base {
public new abstract void Do(); // 隱藏基類方法,強制子類實現新版本
// 注意:這會破壞多態性,基類引用調用仍會執行 Base.Do()
}
| 意圖 | 正確做法 | 避免做法 |
|---|---|---|
| 強制子類實現 | 基類用 abstract,中間類不加修飾符直接繼承 | override abstract |
| 提供可選重寫 | 基類 virtual,子類 override | abstract override |
| 隱藏基類成員 | 新成員用 new(慎用) | override abstract |
原則:保持繼承鏈清晰,每層只做一件事——要么定義契約(abstract),要么提供實現(override),不要混淆。