Возможно ли передать интерфейсный метод в качестве параметров?Способ передачи интерфейса в качестве параметра
Я пытаюсь что-то вроде этого:
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
Edit: Я знаю, что я могу передать весь интерфейс, но тогда я должен указать, какой использовать функцию. Я не хочу двух одинаковых процедур с одним разным вызовом.
Я могу использовать второй параметр, но это тоже уродливо.
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).
Но истинный ответ «нет (прямого) способа передать методы интерфейса в качестве параметров без какого-либо провайдера.
Код в TSomeObject.Move выглядит прецедент для «Стратегия». MoveProc может быть методом класса TAbstractMoveProcStrategy, где подклассы реализуют требуемое поведение в методе Move. TMovePredStrategy/TMoveNextStrategy будет иметь разные движения Move. – mjn