unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyCacl = class(TObject) public { Public declarations } function DynamicFun(funName: string; const a, b: integer): integer; published function add(const a, b: integer): integer; function dec(const a, b: integer): integer; end; TNewMyCacl = class(TMyCacl) published function Multi(const a, b: integer): integer; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TMyCacl } function TMyCacl.add(const a, b: integer): integer; begin result := a + b; end; function TMyCacl.dec(const a, b: integer): integer; begin result := a - b; end; function TMyCacl.DynamicFun(funName: string;const a, b: integer): integer; var pfun: function(const a, b: integer): integer of object; begin if self.MethodAddress(funName) <> nil then begin TMethod(pfun).Code := MethodAddress(funName); result := pfun(a, b); end else result := 0; end; { TNewMyCacl } function TNewMyCacl.Multi(const a, b: integer): integer; begin result := a * b; end; procedure TForm1.Button1Click(Sender: TObject); var tmp: TMyCacl; i: integer; begin tmp := TNewMyCacl.Create(); if tmp.MethodAddress('Multi') <> nil then begin i := tmp.DynamicFun('Multi', 102, 3); showmessage(inttostr(i)); end; tmp.Free; end; end.
以上代碼實現了類中經過函數名動態調用函數的方法,這樣處理的一個優勢是使類的複用性與擴展性獲得增強,好比上例中,以前有一個類TMyCacl,能實現對a與b作加法與減法運算,函數
假現在後需求變化,須要增長其餘運算時,可經過繼承該類,從新寫一個新運算方法,可是調用還用利用DynamicFun函數,這樣在原來的類不要作修改的前提下,很好的實現功能的擴展。spa
這裏必定要注意的是,須要被動態條用的函數必定要是 published 類型,不然MethodAddress將沒法獲取該函數。code