能否将接口的方法作为参数传递?
我正在尝试这样做:
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'
当然我可以为每个调用做一个私有方法,但那很丑陋。是否有更好的方法?
Delphi 2006
编辑:
我知道可以传递整个接口,但那样就必须指定使用哪个函数。我不想用两个完全相同的过程来处理只有一个不同的调用。
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的Visitor。现在我正在使用简单(“丑陋”的)包装器(我自己的,与TOndrej和Aikislave的解决方案相同)。
但真正的答案是,“没有(直接的)方法可以将接口的方法作为参数传递而不需要某种类型的提供者。”