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函數,這樣在原來的類不要做修改的前提下,很好的實現功能的擴展。

這里一定要注意的是,需要被動態條用的函數一定要是 published 類型,否則MethodAddress將無法獲取該函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM