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

Delphi 8 / .NET 平台操作符重載實戰:以 Record 實現數學向量加法

     編輯:Delphi

Delphi 8 引入 .NET 平台支援,帶來操作符重載語法,讓自訂型別(Class 或 Record)能像內建型別一樣使用 +、-、*、/ 等運算子。本文以 Record 實作二維向量加法為例,示範 class operator 語法與 WinForms 整合測試。

核心語法:class operator

type
  TVector2D = record
  public
    X, Y: Integer;
    // 重載 + 運算子
    class operator Add(const A, B: TVector2D): TVector2D;
  end;

class operator TVector2D.Add(const A, B: TVector2D): TVector2D;
begin
  Result.X := A.X + B.X;
  Result.Y := A.Y + B.Y;
end;

支援的運算子: Add、Subtract、Multiply、Divide、Equal、NotEqual、GreaterThan、LessThan、Implicit、Explicit(型別轉換)等。

為何選 Record 而非 Class?

  • Record 為值型別,存放於堆疊,無需 Create/Free,語意更接近數學向量
  • 避免參考計數與記憶體管理負擔
  • 複製語意為逐欄位複製,符合直覺

完整 WinForms 測試專案

unit WinForm;

interface
uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data;

type
  TWinForm = class(System.Windows.Forms.Form)
    {$REGION 'Designer Managed Code'}
    strict private
      Components: System.ComponentModel.Container;
      Button1: System.Windows.Forms.Button;
      procedure InitializeComponent;
      procedure Button1_Click(sender: System.Object; e: System.EventArgs);
    {$ENDREGION}
    strict protected
      procedure Dispose(Disposing: Boolean); override;
    public
      constructor Create;
  end;

  TVector2D = record
  public
    X, Y: Integer;
    class operator Add(const A, B: TVector2D): TVector2D;
  end;

  [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))]

implementation
{$REGION 'Windows Form Designer generated code'}
procedure TWinForm.InitializeComponent;
begin
  Self.Button1 := System.Windows.Forms.Button.Create;
  Self.SuspendLayout;
  Self.Button1.Location := System.Drawing.Point.Create(96, 88);
  Self.Button1.Name := 'Button1';
  Self.Button1.Size := System.Drawing.Size.Create(392, 112);
  Self.Button1.TabIndex := 0;
  Self.Button1.Text := '測試向量相加';
  Include(Self.Button1.Click, Self.Button1_Click);
  Self.AutoScaleBaseSize := System.Drawing.Size.Create(6, 14);
  Self.ClientSize := System.Drawing.Size.Create(560, 357);
  Self.Controls.Add(Self.Button1);
  Self.Name := 'TWinForm';
  Self.Text := 'Operator Overload Demo';
  Self.ResumeLayout(False);
end;
{$ENDREGION}

procedure TWinForm.Dispose(Disposing: Boolean);
begin
  if Disposing then
    if Components <> nil then Components.Dispose();
  inherited Dispose(Disposing);
end;

constructor TWinForm.Create;
begin
  inherited Create;
  InitializeComponent;
end;

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);
var
  A, B, C: TVector2D;
begin
  A.X := 1; A.Y := 2;
  B.X := 3; B.Y := 4;
  C := A + B;  // 直接使用 + 運算子
  System.Windows.Forms.MessageBox.Show(
    Format('(%d, %d) + (%d, %d) = (%d, %d)', [A.X, A.Y, B.X, B.Y, C.X, C.Y])
  );
end;

{ TVector2D }
class operator TVector2D.Add(const A, B: TVector2D): TVector2D;
begin
  Result.X := A.X + B.X;
  Result.Y := A.Y + B.Y;
end;

end.

執行結果

點擊按鈕彈出訊息框:(1, 2) + (3, 4) = (4, 6)

遷移提醒:Delphi 8 之後版本

  • Delphi 2005+ 完整支援 Win32 平台操作符重載(需 {$OPERATORS ON} 或專案選項啟用)
  • Record 運算子重載於 Win32 與 .NET 行為一致
  • 複數、矩陣、單位量、貨幣等領域模型皆受益於運算子重載,提升程式碼可讀性

操作符重載讓領域模型語言化,是現代 Delphi 物件導向設計的重要利器。

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