Я не знаю точную причину, по которой вам нужно это сделать, но лично я думаю, что было бы лучше передать весь объект "Mover" вместо одного из его методов. Я использовал этот подход в прошлом, он называется паттерном «посетитель».
tiOPF, инфраструктура сохранения объектов, широко использует ее и дает хороший пример того, как она работает: Шаблон посетителя и tiOPF .
Это относительно долго, но оказалось очень полезным для меня, даже когда я не использовал tiOPF. Обратите внимание на шаг 3 в документе под названием « Шаг № 3. Вместо передачи указателя метода мы передадим объект ».
DiGi, чтобы ответить на ваш комментарий: Если вы используете шаблон Visitor, то у вас нет интерфейса, реализующего несколько методов, а только один (Выполнить). Затем у вас будет класс для каждого действия, например TPred, TNext, TSomething, и вы передаете экземпляр таких классов объекту, который нужно обработать. Таким образом, вам не нужно знать, что вызывать, вы просто позвоните «Visitor.Execute», и он выполнит свою работу.
Здесь вы можете найти базовый пример:
interface
type
TVisited = class;
TVisitor = class
procedure Execute(Visited: TVisited); virtual; abstract;
end;
TNext = class(TVisitor)
procedure Execute (Visited: TVisited); override;
end;
TPred = class(TVisitor)
procedure Execute (Visited: TVisited); override;
end;
TVisited = class(TPersistent)
public
procedure Iterate(pVisitor: TVisitor); virtual;
end;
implementation
procedure TVisited.Iterate(pVisitor: TVisitor);
begin
pVisitor.Execute(self);
end;
procedure TNext.Execute(Visited: TVisited);
begin
// Implement action "NEXT"
end;
procedure TPred.Execute(Visited: TVisited);
begin
// Implement action "PRED"
end;
procedure Usage;
var
Visited: TVisited;
Visitor: TVisitor;
begin
Visited := TVisited.Create;
Visitor := TNext.Create;
Visited.Iterate(Visitor);
Visited.Free;
end;