using System;
// 抽象類別
abstract class AbstractClass
{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
// 模板方法
public void TemplateMethod()
{
Console.WriteLine("In AbstractClass.TemplateMethod()");
PrimitiveOperation1();
PrimitiveOperation2();
}
}
// 具體類別
class ConcreteClass : AbstractClass
{
public override void PrimitiveOperation1()
=> Console.WriteLine("Called ConcreteClass.PrimitiveOperation1()");
public override void PrimitiveOperation2()
=> Console.WriteLine("Called ConcreteClass.PrimitiveOperation2()");
}
// 客戶端
public class Client
{
public static void Main()
{
ConcreteClass c = new ConcreteClass();
c.TemplateMethod();
}
}
In AbstractClass.TemplateMethod() Called ConcreteClass.PrimitiveOperation1() Called ConcreteClass.PrimitiveOperation2()
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| is-a 關係、共享核心流程、受控擴展點 | 繼承 + 模板方法 | 流程固定、細節可變、編譯時綁定 |
| has-a 關係、行為需動態切換、多種組合 | 委派/策略模式 | 運行時綁定、組合靈活、符合合成復用原則 |
**恰當使用繼承的典範**:將可復用的一般性行為上移基類,特化行為下放子類。熟悉此模式 = 重新學會正確使用繼承。