delphi經過函數名動態調用函數的方法(方便功能的擴展)

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

相關文章
相關標籤/搜索