インターフェイスのメソッドをパラメータとして渡すことはできますか?このようなインターフェイスのメソッドをパラメータとして渡す
私がしようとしている何か:
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' と '手順、型なしポインタまたは型なしパラメーター'
もちろん、コールごとにプライベートメソッドを実行できますが、それは醜いです。もっと良い方法はありますか?
デルファイ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の同じ解決策)を使用しています。そのためのインターフェイスのスコーピングの
しかし、本当の答えは、プロバイダのいくつかの種類せずにパラメータとしてインターフェイスのメソッドを渡すなし(直接の)方法はありません」です。
TSomeObject.Moveのコードはのためのユースケースのように見えます「戦略」パターン。 MoveProcはTAbstractMoveProcStrategyクラスのメソッドです。ここでは、サブクラスがMoveメソッドで必要な動作を実装しています。 TMovePredStrategy/TMoveNextStrategyは、異なるMove procsを持ちます。 – mjn