Delphi 物件導向程式設計的基石是類與物件。本文從類聲明語法、繼承體系、物件創建與釋放、基類/子類多態賦值、類型查詢(ClassType/ClassParent)、類前向聲明與關聯等核心知識點逐一講解,並提供可直接編譯的代碼範例。
type
ClassName = class [abstract | sealed] (AncestorClass)
MemberList
end;
abstract:抽象類,不可實例化,僅供繼承。sealed:密封類,禁止進一步繼承(Delphi 10.4+ 支援)。AncestorClass:父類,省略時默認繼承 TObject。// 定義
type
TMemoryStream = class(TCustomMemoryStream)
private
FCapacity: Longint;
procedure SetCapacity(NewCapacity: Longint);
protected
function Realloc(var NewCapacity: Longint): Pointer; virtual;
public
property Capacity: Longint read FCapacity write SetCapacity;
destructor Destroy; override;
procedure Clear;
procedure LoadFromStream(Stream: TStream);
procedure LoadFromFile(const FileName: string);
procedure SetSize(NewSize: Longint); override;
function Write(const Buffer; Count: Longint): Longint; override;
end;
// 使用
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
Stream.LoadFromFile('data.bin');
// ...
finally
Stream.Free;
end;
end;
// 繼承單一父類
type
TSomeControl = class(TControl);
// 根類 TObject
type
TMyClass = class; // 等同於 class(TObject)
TMyClass = class(TObject); // 顯式寫法
Delphi 單一繼承,所有類最終隱式繼承自 System.TObject。
type
TFigure = class(TObject);
TRectangle = class(TFigure);
TSquare = class(TRectangle);
var
Fig: TFigure;
begin
Fig := TFigure.Create; // OK
Fig := TRectangle.Create; // OK:子類實例賦值給父類變量
Fig := TSquare.Create; // OK
end;
var
Obj: TObject;
Cls: TClass; // TClass = class of TObject
begin
Obj := TButton.Create(nil);
// 取得實際類型
Cls := Obj.ClassType; // TButton
ShowMessage(Cls.ClassName); // 'TButton'
// 走訪繼承鏈
while Cls <> nil do
begin
ShowMessage(Cls.ClassName); // TButton → TButtonControl → TWinControl → TControl → TComponent → TPersistent → TObject
Cls := Cls.ClassParent;
end;
end;
關鍵屬性/方法:
ClassType:回傳物件的實際類別參考(TClass)。ClassParent:回傳父類別參考。ClassName:類別名稱字串。InheritsFrom(AClass: TClass): Boolean:判斷是否繼承自某類。type
TFigure = class; // 前向聲明
TDrawing = class
Figure: TFigure; // 引用尚未完整定義的 TFigure
end;
TFigure = class // 定義聲明
Drawing: TDrawing;
end;
前向聲明解決循環引用問題,編譯器允許在完整定義前使用類名作為指標/引用類型。
Obj := TMyClass.Create(...)。Obj.Free(內部檢查 nil)或 FreeAndNil(Obj)(SysUtils)。IInterface 時,_AddRef/_Release 控制生命週期,切勿混用 Free。| 錯誤代碼 | 問題 | 正確寫法 |
|---|---|---|
var O: TMyClass; O.Method; | 未實例化直接呼叫 | O := TMyClass.Create; try O.Method; finally O.Free; end; |
O := TChild.Create; (O as TParent).VirtualMethod; | 以為會呼叫子類覆寫 | 直接 O.VirtualMethod 即為多態呼叫 |
ClassParent.ClassName 於 TObject | 存取 nil 導致 AV | 迴圈判斷 while Cls <> nil do |
掌握類聲明、繼承、實例化與類型查詢,是編寫健壯 Delphi 物件導向程式的第一步。建議配合 IDE 的 Ctrl+Shift+C(類完成)與 F12(單元切換)提升開發效率。