Возможно ли передать интерфейсный метод в качестве параметров?
Я пробую что-то вроде этого:
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" и "процедура, нетипизированный указатель или нетипизированный параметр"
Конечно, я могу сделать частный метод для каждого вызова, но это уродливо. Есть ли лучший способ?
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) является Диего Посетитель. Теперь я использую простую ( "уродливую" ) обертку (мое собственное, то же самое решение от TOndrej и Aikislave).
Но верным ответом является "нет (прямого) способа передачи интерфейсных методов в качестве параметров без какого-либо провайдера.