¿Es posible pasar el método de la interfaz como parámetros?Pasando el método de la interfaz como parámetro
Estoy intentando algo como esto:
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;
Pero no está funcionando porque:
E2010 tipos incompatibles: 'TMoveProc' y 'procedimiento, sin tipo de puntero o parámetro sin tipo'
Por supuesto que puedo hacer un método privado para cada llamada, pero eso es feo. ¿Hay alguna forma mejor?
Delphi 2006
Editar: sé que puedo pasar toda la interfaz, pero luego tengo que especificar el uso de la función. No quiero dos exactamente los mismos procedimientos con una llamada diferente.
Puedo usar el segundo parámetro, pero eso también es feo.
type
SomeInterfaceMethod = (siPred, siNext)
procedure Move(SomeInt: ISomeInterface; Direction: SomeInterfaceMethod)
begin
case Direction of:
siPred: SomeInt.Pred;
siNext: SomeInt.Next
end;
end;
Gracias a todos por la ayuda e ideas. La solución limpia (para mi Delphi 2006) es el Visitante de Diego. Ahora estoy usando un envoltorio simple ("feo") (el mío, la misma solución de TOndrej y Aikislave).
Pero la verdadera respuesta es "no hay manera (directa) para aprobar los métodos de la interfaz como parámetros sin algún tipo de proveedor.
El código en TSomeObject.Move parece un caso de uso para un patrón de 'Estrategia'. MoveProc podría ser un método de una clase TAbstractMoveProcStrategy, donde las subclases implementan el comportamiento requerido en el método Move. TMovePredStrategy/TMoveNextStrategy tendría diferentes Move procs. – mjn