// 錯誤嘗試:C# 不支援多重繼承
public abstract class SingerDancer : Singer, Dancer { }
問題:Singer、Dancer 繼承 Person,導致 SingerDancer 無法多重繼承,且違反單一職責。
// 行為介面
public interface ISing { void SingSong(); }
public interface IDance { void Dance(); }
// 具體角色實作介面
public abstract class Singer : Person, ISing { public void SingSong() { } }
public abstract class Dancer : Person, IDance { public void Dance() { } }
// 組合能力
public abstract class SingerDancer : Person, ISing, IDance {
public void SingSong() { }
public void Dance() { }
}
透過介面分離「唱歌」「跳舞」行為,SingerDancer 可同時實作多介面,符合介面隔離原則。
// 錯誤設計:強制所有鳥會飛
public abstract class Bird { public abstract void Fly(); }
public abstract class Penguin : Bird { } // 企鵝不會飛,違反里氏替換原則
public abstract class Bird { } // 基類僅含共性
public interface IFly { void Fly(); }
public abstract class Crow : Bird, IFly { }
public abstract class Pigeon : Bird, IFly { }
public abstract class Penguin : Bird { } // 不實作 IFly,完美符合
將「飛行」抽象為介面,只有會飛的鳥實作,企鵝自然不受影響。
| 場景 | 選擇 | 理由 |
|---|---|---|
| 定義核心身分、共享預設實作 | 抽象類 | 表達「是一種」關係,提供共同基礎 |
| 定義可選行為、跨層級複用 | 介面 | 表達「能做某事」,支援多重實作 |
| 需要版本控制、二進制相容性 | 抽象類 | 可新增非抽象成員不破壞現有代碼 |
| 頻繁變動、多組件獨立演進 | 介面 | 契約穩定,實現細節可獨立變更 |
**「抽象類建模名詞(名詞導向),介面建模動詞(動詞導向)」。** 遇到多重能力組合、行為不普遍共享時,優先考慮介面組合而非繼承層次深化。