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

深入理解 Delphi 類(十一):方法分類全解析——虛/動態/類/靜態/抽象/消息/構造/析構

     編輯:Delphi

前言

方法是類行為的載體,Delphi 提供豐富的方法修飾符構建多態、封裝、元編程能力。本文系統講解虛/動態方法差異、覆蓋與重定義規則、實現時參數省略、訪問限制、靜態/類/靜態類方法、方法重載、inherited 語義、抽象方法/類、final/sealed、構造/析構方法、事件方法、消息方法、調用約定等完整知識體系。

1. 虛方法 vs 動態方法

維度虛方法 (virtual)動態方法 (dynamic)
查找表VMT (虛方法表),含所有祖先虛方法DMT (動態方法表),僅含當前類動態方法
調用速度快 (單次間接索引)較慢 (可能需沿繼承鏈查找 DMT)
內存佔用大 (每類一個完整 VMT)小 (僅存儲自有動態方法)
歷史Delphi 1 即有後期引入以節省 VCL 體積
事件方法早期定義VCL 事件多為 dynamic
互換性可相互替換可相互替換

建議:高頻調用、核心多態用 virtual;事件、低頻、大量類層級用 dynamic。

2. 覆蓋 vs 重定義

{標準覆蓋}
TBass = class procedure Proc; virtual; end;
TChild = class(TBass) procedure Proc; override; end;

{重定義情況 (編譯警告)}
1. 父無 virtual, 子無 override
2. 父無 virtual, 子 virtual
3. 父 virtual, 子 virtual (無 override)
4. 父 virtual, 子無關鍵字
5. 父 virtual, 子 dynamic

{消除警告}
- 子方法加 reintroduce
- 或 {$WARNINGS OFF} ... {$WARNINGS ON}

3. 實現時參數省略

TBass = class
  function Fun1(x,y: Integer): Integer; virtual;
  function Fun2(x,y,z: Integer): Integer;
end;

function TBass.Fun1(x,y: Integer): Integer; {實現不可帶 virtual}
function TBass.Fun2; {僅寫函數名, 參數/返回類型自動繼承}

4. 訪問限制 (可見性)

區域關鍵字可訪問範圍RTTI
公共 (默認)-單元外可見{$M+} 時屬 published
私有private僅類內部無
保護protected類內部 + 子孫類無
公開public完全公開無
發布published公開 + RTTI + 設計時有
嚴格私有strict private僅類內部 (單元外不可見)無
嚴格保護strict protected類內部 + 子孫類 (單元外不可見)無

同一單元內類互為「友元」,可訪問私有/保護成員(除非用 strict)。

5. 靜態/類/靜態類方法

  • 靜態方法:默認,無 virtual/dynamic/class,需實例調用。
  • 類方法:class procedure/class function,可通過類名直接調用 (TMyClass.Alert('Hi')),不可訪問實例字段,不可為虛方法。
  • 靜態類方法:class procedure ... static;,可放 private,用於類屬性讀寫,不佔用 VMT/DMT。

6. 方法重載

  • 同名不同參數列表,必須標記 overload。
  • 重載父類方法時,若父類方法在本類未重載,子類可省略 overload。
  • published 區禁止重載(編譯器會自動將公共區重載移至 public)。

7. inherited 關鍵字

procedure TChild.Proc;
begin
  inherited Proc; {調用父類同名方法, 可省略方法名}
  inherited;      {完全等價}
  inherited Proc(1,2); {傳遞參數}
  ShowMessage(inherited Fun(11,22)); {調用父類函數並用返回值}
end;

8. 抽象方法與抽象類

TMyClass = class
  procedure Proc1; virtual; abstract; {純虛方法}
  function Fun: string; dynamic; abstract;
end;

{現代語法}
TBass = class abstract(TObject)
  procedure Proc; virtual; abstract;
end;

TStrings 是經典抽象類,實例化需用 TStringList。

9. final / sealed

TB = class(TA)
  procedure Proc; override; final; {不可再被覆蓋}
end;

TMyClass = class sealed(TObject) {不可被繼承}
end;

10. 構造/析構方法

constructor Create; {可重載, 編譯器自動處理 inherited Create}
destructor Destroy; override; {虛方法, 配合 Free 安全釋放}

constructor TMyClass.Create(x,y: Integer);
begin
  inherited; {調用父類 Create}
  {初始化}
end;

destructor TMyClass.Destroy;
begin
  {清理}
  inherited; {調用父類 Destroy}
end;

11. 事件方法

事件本質是方法指針類型屬性,屬性讀寫對應 add/remove 訪問器,IDE 雙擊自動生成骨架。

12. 消息方法

procedure KeyDown(var Msg: TWMKeyDown); message WM_KEYDOWN;
{參數必須 var, 類型為對應消息記錄}
{消息攔截優先於事件, inherited 可轉發給父類/事件}

13. 調用約定

指示字參數順序棧清理參數傳遞用途
register左→右被調用者前 3 參數用寄存器Delphi 默認,最快
pascal左→右被調用者棧兼容 Pascal
cdecl右→左調用者棧C/C++ DLL、非 Windows
stdcall右→左被調用者棧Windows API
safecall右→左被調用者棧COM 雙重介面

總結

Delphi 方法體系極其完備,從虛/動態多態到類/靜態類元編程,從消息攔截到底層調用約定,精準掌握各修飾符語義與組合規則,是編寫高性能、可擴展、互操作類庫的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved