Delphi 8 引入 .NET 平台支援,帶來操作符重載語法,讓自訂型別(Class 或 Record)能像內建型別一樣使用 +、-、*、/ 等運算子。本文以 Record 實作二維向量加法為例,示範 class operator 語法與 WinForms 整合測試。
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(型別轉換)等。
Create/Free,語意更接近數學向量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)
{$OPERATORS ON} 或專案選項啟用)操作符重載讓領域模型語言化,是現代 Delphi 物件導向設計的重要利器。