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

Delphi 類與物件完整入門:聲明、繼承、實例化與類型查詢

     編輯:Delphi

Delphi 物件導向程式設計的基石是類與物件。本文從類聲明語法、繼承體系、物件創建與釋放、基類/子類多態賦值、類型查詢(ClassType/ClassParent)、類前向聲明與關聯等核心知識點逐一講解,並提供可直接編譯的代碼範例。

1. 類聲明基本格式

type
  ClassName = class [abstract | sealed] (AncestorClass)
    MemberList
  end;
  • abstract:抽象類,不可實例化,僅供繼承。
  • sealed:密封類,禁止進一步繼承(Delphi 10.4+ 支援)。
  • AncestorClass:父類,省略時默認繼承 TObject。

2. 類聲明與使用實例

// 定義
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;

3. 類繼承

// 繼承單一父類
type
  TSomeControl = class(TControl);

// 根類 TObject
type
  TMyClass = class;           // 等同於 class(TObject)
  TMyClass = class(TObject);  // 顯式寫法

Delphi 單一繼承,所有類最終隱式繼承自 System.TObject。

4. 基類與子類多態賦值

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;

5. 獲取物件類型資訊

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:判斷是否繼承自某類。

6. 類前向聲明與相互關聯

type
  TFigure = class;  // 前向聲明

  TDrawing = class
    Figure: TFigure;  // 引用尚未完整定義的 TFigure
  end;

  TFigure = class  // 定義聲明
    Drawing: TDrawing;
  end;

前向聲明解決循環引用問題,編譯器允許在完整定義前使用類名作為指標/引用類型。

7. 記憶體管理最佳實踐

  1. 建立:Obj := TMyClass.Create(...)。
  2. 使用:透過介面或基類變量持有。
  3. 釋放:Obj.Free(內部檢查 nil)或 FreeAndNil(Obj)(SysUtils)。
  4. 介面計數:實作 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(單元切換)提升開發效率。

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