其實 Delphi 2006 就已經(jīng)支持運算符重載了, 不過 for Win32 的版本只是在 record 里支持. 運算符重載有什么用處呢? 舉個例子: 譬如 "張三"、"李四" 兩人一起來拜見你, 你可能會問: "你們兩個誰大?" 其實你是在問: "你們兩個誰的年齡大?"; 但生活中人們一般都不這么羅嗦. 在程序中能否這樣簡化呢? 這只能通過 "運算符重載" 做到! 先按 "你們兩個誰的年齡大?" 寫出原始例子吧: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} type TMyRec = record name: string; age: Word; end; procedure TForm1.Button1Click(Sender: TObject); var r1,r2: TMyRec; str: string; begin r1.name := '張三'; r1.age := 18; r2.name := '李四'; r2.age := 81; if r1.age > r2.age then str := r1.name else str := r2.name; ShowMessageFmt('%s年齡大', [str]); {李四年齡大} end; end. 上面是用 r1.age > r2.age 對比年齡, 如果能用 r1 > r2 來對比的話, 那就相當于: "你們兩個誰大?" 了. 這樣我們需要重載運算符 ">" ; 所謂重載運算符就是賦予某個運算符新的含義、新的功能. 我們可以重載的運算符只能是 Delphi 已有的運算符(還不是全部); C++ 也是這樣. 需要用對應(yīng)的指示字來表示這個運算符, 譬如: ">" 要用 GreaterThan 表示; C++ 不是這樣. 重載運算符是通過方法實現(xiàn)的, 不過方法的指示字是 class operator (而非 function 或 proceture). 譬如上面的 record 可以這樣聲明: type TMyRec = record name: string; age: Word; class operator GreaterThan(a,b: TMyRec): Boolean; end; 還得有方法的實現(xiàn)(遺憾的是有些不能用 Ctrl+Shift+C 自動建立, 那就復(fù)制吧): class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean; {注意復(fù)制后再加上方法名: "TMyRec."} begin Result := a.age > b.age; end; 下面是完整的代碼: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} type TMyRec = record name: string; age: Word; class operator GreaterThan(a,b: TMyRec): Boolean; end; class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean; begin Result := a.age > b.age; end; procedure TForm1.Button1Click(Sender: TObject); var r1,r2: TMyRec; str: string; begin r1.name := '張三'; r1.age := 18; r2.name := '李四'; r2.age := 81; if r1 > r2 then str := r1.name else str := r2.name; ShowMessageFmt('%s年齡大', [str]); {李四年齡大} end; end. 這個測試里面有一些漏洞, 譬如: 年齡相等怎么辦? 不必較真, 只是借此說明一個道理而已. |
|