インターフェイスのメソッドをパラメータとして渡すことは可能ですか?
私はこのようなことを試みています:
interface
type
TMoveProc = procedure of object;
// also tested with TMoveProc = procedure;
// procedure of interface is not working ;)
ISomeInterface = interface
procedure Pred;
procedure Next;
end;
TSomeObject = class(TObject)
public
procedure Move(MoveProc: TMoveProc);
end;
implementation
procedure TSomeObject.Move(MoveProc: TMoveProc);
begin
while True do
begin
// Some common code that works for both procedures
MoveProc;
// More code...
end;
end;
procedure Usage;
var
o: TSomeObject;
i: ISomeInterface;
begin
o := TSomeObject.Create;
i := GetSomeInterface;
o.Move(i.Next);
// somewhere else: o.Move(i.Prev);
// tested with o.Move(@i.Next), @@... with no luck
o.Free;
end;
しかし、次の理由で機能していません。
E2010 互換性のない型: 'TMoveProc' および 'procedure, untyped pointer or untyped parameter'
もちろん、呼び出しごとにプライベートメソッドを実行できますが、それは醜いです。もっと良い方法はありますか?
デルファイ 2006
編集:インターフェイス全体を渡すことができることはわかっていますが、使用する関数を指定する必要があります。1 つの異なる呼び出しで 2 つのまったく同じ手順は必要ありません。
2 番目のパラメーターを使用できますが、それも醜いです。
type
SomeInterfaceMethod = (siPred, siNext)
procedure Move(SomeInt: ISomeInterface; Direction: SomeInterfaceMethod)
begin
case Direction of:
siPred: SomeInt.Pred;
siNext: SomeInt.Next
end;
end;
助けとアイデアをありがとう。クリーンなソリューション (私の Delphi 2006 の場合) は、Diego's Visitor です。今、私は単純な (「醜い」) ラッパー (TOndrej と Aikislave による私自身の同じソリューション) を使用しています。
しかし、本当の答えは、「ある種のプロバイダーなしでインターフェースのメソッドをパラメーターとして渡す (直接的な) 方法はありません。