首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 靜態、虛擬與動態方法差異深度解析

     編輯:Delphi

前言

Delphi 物件導向提供三種方法類型:靜態、虛擬、動態。理解它們在呼叫機制、記憶體佔用、執行速度與多型支援上的差異,對設計高效、可維護的類別架構至關重要。

1. 靜態方法

  • 預設類型,若未指定 virtual 或 dynamic 即為靜態。
  • 編譯期綁定:編譯器已知方法位址,直接嵌入呼叫指令,速度最快。
  • 不支援多型:無法被子類別 override 覆寫,若在子類別重新宣告同名靜態方法,屬於「遮蔽」而非覆寫。
  • 佔用 1 位元組記憶體(同 Boolean)。

2. 虛擬方法

  • 以 virtual 關鍵字宣告,子類別用 override 覆寫。
  • 虛擬方法表 (VMT):編譯器為每個類別建立 VMT,執行期透過 VMT 查找實際方法位址,支援多型。
  • VMT 包含繼承鏈上所有虛擬方法,記憶體佔用較大,但查找速度快(單次間接跳轉)。
  • Ord(False)=0, Ord(True)=1,屬有序類型。

3. 動態方法

  • 以 dynamic 宣告,同樣可 override。
  • 動態方法表 (DMT):僅儲存該類別自行宣告的動態方法,不包含祖先方法。查找時若本身 DMT 找不到,會遞迴往祖先 DMT 尋找。
  • 記憶體佔用比虛擬方法少(稀疏表),但執行速度較慢(可能需多層查找)。
  • 適合大量方法但較少被覆寫的情境。

4. 覆寫與遮蔽

  • override 只能用於 virtual/dynamic 方法,會替換 VMT/DMT 中的條目,祖先實作仍保留可透過 inherited 呼叫。
  • 對靜態方法使用 override 會造成真正覆蓋(編譯錯誤或警告),新方法完全取代祖先同名方法。

比較總結表

特性靜態虛擬動態
宣告關鍵字無virtualdynamic
綁定時機編譯期執行期 (VMT)執行期 (DMT)
多型支援否是是
記憶體開銷最小較大 (完整 VMT)較小 (稀疏 DMT)
呼叫速度最快快較慢
適用場景工具函式、不需多型核心多型行為大量稀疏覆寫方法

建議

  • 預設使用 靜態方法,效能最佳。
  • 需要多型行為時,優先選擇 虛擬方法。
  • 類別擁有大量方法但僅少數被覆寫,考慮 動態方法 節省記憶體。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved