首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 動靜結合編程(二):繼承哲學 vs 鴨子哲學——領域建模的靈活性抉擇

     編輯:關於C#

兩種哲學的核心差異

  • 繼承哲學:「你繼承什麼,你就是什麼」——關注型別層級結構,靜態編譯期確定
  • 鴨子哲學:「你能做什麼,你就是什麼」——關注物件行為能力,執行期可動態組合

兩者無優劣,唯適用場景不同。

案例:教練與隊員的角色轉換

劉國梁:選手 → 教練。用介面 IPlayer、ICoach 建模:

  • 繼承哲學:靜態型別無法在運行期移除/新增介面實作,難以自然表達角色轉換
  • 組合替代:定義行為介面 IPlay、ITeach,物件持有行為屬性,透過屬性賦值/拋異常表達「擁有/不擁有」某行為

從繼承到組合:焦點轉移帶來的靈活性

// 繼承版:靜態、僵化
interface IPlayer { void Play(); }
interface ICoach { void Teach(); }
class LiuGuoLiang : IPlayer, ICoach { ... } // 一輩子同時是選手與教練?

// 組合版:動態行為
class Person
{
    public IPlay PlayBehavior { get; set; }
    public ITeach TeachBehavior { get; set; }
    public void Play() => PlayBehavior?.Play() ?? throw new InvalidOperationException("非選手");
    public void Teach() => TeachBehavior?.Teach() ?? throw new InvalidOperationException("非教練");
}

// 使用
var liu = new Person { PlayBehavior = new PlayerBehavior() };
liu.Play(); // 選手時期
liu.PlayBehavior = null;
liu.TeachBehavior = new CoachBehavior();
liu.Teach(); // 教練時期

組合將焦點從「繼承什麼」轉移到「能做什麼」,雖 C# 組合關係仍為靜態,但已引入動態元素(屬性可變),更貼近領域本質。

下一站:Duck Typing 純粹實現

下篇將展示無需介面實作、無需組合屬性,直接以行為簽名動態粘合物件與介面的 Duck Typing 技術。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved