多型讓程式透過統一介面調用不同實現,增強表達力與靈活性。最熟悉的形式是 型別多型(含介面繼承):
var animals = new List
{
new Cat("Missy"),
new Cat("Mr. Bojangles"),
new Dog("Lassie")
};
foreach (var a in animals)
Console.WriteLine($"{a.Name}: {a.Talk()}");
C# 繼承雙重功能:
「父子關係」強調復用(兒子似父親);「動物-狗關係」強調被復用(抽象與具體)。濫用繼承做復用 會帶來靜態約束副作用(物件生命週期無法改變繼承關係),建議:復用首選組合,多型才用繼承/介面。
T 表達行為,具體化交給使用者Func、Action、Predicate 等內建泛型委託,融合了:
GoF 早預見泛型+委託的威力,C# 語言層面原生支援(C++ 需 Boost.Function)。
// 以泛型委託替代 IStrategy 介面
public class Processor
{
public Func Strategy { get; set; }
public int Execute(int a, int b) => Strategy(a, b);
}
// 使用:直接傳入 Lambda,無需建立類別
var p = new Processor { Strategy = (x, y) => x + y };
Console.WriteLine(p.Execute(3, 5)); // 8
p.Strategy = (x, y) => x * y;
Console.WriteLine(p.Execute(3, 5)); // 15
泛型委託讓「演算法族群」以第一級函數形式流動,極大降低儀式性代碼。