多態簡單來說:同一個方法呼叫,根據物件實際類型執行不同的實作邏輯。在 Delphi 中,透過 virtual(虛擬方法)與 override(覆寫)關鍵字實現執行期動態綁定。
TBass = class
procedure Alert; virtual; // 標記為虛擬,允許子類別覆寫
end;
TChild1 = class(TBass)
procedure Alert; override; // 覆寫父類別方法
end;
TChild2 = class(TBass)
procedure Alert; override;
end;
procedure TBass.Alert;
begin
ShowMessage('is Bass');
end;
procedure TChild1.Alert;
begin
ShowMessage('is TChild1');
end;
procedure TChild2.Alert;
begin
ShowMessage('is TChild2');
end;
關鍵在於:變數型別為父類別,實際指向子類別實例。
// 測試 1:基底類別實例
var Bass: TBass;
begin
Bass := TBass.Create;
Bass.Alert; // 輸出: is Bass
Bass.Free;
end;
// 測試 2:子類別 1 實例,指派給父類別變數
var Bass: TBass;
begin
Bass := TChild1.Create; // 實際建立 TChild1
Bass.Alert; // 輸出: is TChild1(動態綁定!)
Bass.Free;
end;
// 測試 3:子類別 2 實例
var Bass: TBass;
begin
Bass := TChild2.Create;
Bass.Alert; // 輸出: is TChild2
Bass.Free;
end;
| 關鍵字 | 用途 |
|---|---|
virtual | 在基底類別宣告,表示「此方法可被覆寫」 |
override | 在子類別實作,表示「覆寫父類別同名虛擬方法」 |
| 動態綁定 | 執行期根據物件實際類型決定呼叫哪個實作 |
| 靜態綁定 | 編譯期決定(非 virtual 方法) |
Delphi 另提供 dynamic(動態方法,節省虛擬方法表空間)與 message(訊息處理)關鍵字,同樣支援多態,但使用情境不同。
多態是物件導向三大支柱之一。善用 virtual/override,配合父類別參考指向子類別實例,即可撰寫出彈性、可擴充的程式碼結構。