分三種:
| 類型 | 宣告 | 實作 | 子類別行為 | C# 標記 |
|---|---|---|---|---|
| 抽象方法 | 抽象類別 | 無 | **必須**實作 | abstract |
| 具體方法 | 抽象類別 | 抽象類別 | 不實作/不覆寫 | 無 abstract |
| 鉤子方法 | 抽象類別 | 抽象類別(通常空實作) | 可選擇擴展 | 慣用 Do 前綴 |
abstract class ReportGenerator
{
// 模板方法
public void Generate()
{
FetchData();
if (NeedHeader()) RenderHeader(); // 鉤子方法控制流程
RenderBody();
if (NeedFooter()) RenderFooter(); // 鉤子方法控制流程
}
protected abstract void FetchData();
protected abstract void RenderBody();
// 鉤子方法:預設空實作,子類別可選擇覆寫
protected virtual bool NeedHeader() => true;
protected virtual void RenderHeader() { }
protected virtual bool NeedFooter() => false;
protected virtual void RenderFooter() { }
}
class SimpleReport : ReportGenerator
{
protected override void FetchData() { /* ... */ }
protected override void RenderBody() { /* ... */ }
// 不覆寫鉤子方法,使用預設行為
}
class DetailedReport : ReportGenerator
{
protected override void FetchData() { /* ... */ }
protected override void RenderBody() { /* ... */ }
protected override bool NeedFooter() => true; // 覆寫鉤子方法
protected override void RenderFooter() { /* 詳細頁尾 */ }
}