傳遞的方法作爲一個參數一個參數是沒有問題的:傳遞一個方法的代碼作爲一個類型安全的方式
type
TSomething = class
Msg: string;
procedure Show;
end;
procedure TSomething.Show;
begin
ShowMessage(Msg);
end;
type TProc = procedure of object;
procedure Test(Proc: TProc);
begin
Proc;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Smth: TSomething;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello';
Test(Smth.Show);
end;
我需要一些有難度的 - 只傳遞一個方法的代碼部分。我知道我可以做到這一點:
procedure Test2(Code: Pointer);
var
Smth: TSomething;
Meth: TMethod;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello Hack';
Meth.Data:= Smth;
Meth.Code:= Code;
TProc(Meth);
Smth.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Test2(@TSomething.Show);
end;
但這是一個黑客和不安全 - 編譯器無法檢查方法的參數。
問題:是否有可能以類型安全的方式做同樣的事情?
出於興趣,你爲什麼要這樣做?第一個代碼示例中的直接方法看起來簡單得多。 – Johan 2012-03-15 14:12:16
我希望我的標題編輯更清楚地表明,你沒有做一些初學者會做的事情,這是一個非常深刻的黑客攻擊。 – 2012-03-15 14:22:47
@Johan - 擺脫很多重複的代碼 – kludg 2012-03-15 14:25:50