Ist es möglich, die Methode der Schnittstelle als Parameter zu übergeben?
Ich versuche etwas in dieser Richtung:
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;
Aber es funktioniert nicht, weil:
E2010 Inkompatible Typen: 'TMoveProc' und 'Prozedur, nicht typisierter Zeiger oder nicht typisierter Parameter'
Natürlich kann ich für jeden Aufruf eine private Methode verwenden, aber das ist unschön. Gibt es einen besseren Weg?
Delphi 2006
Bearbeiten: Ich weiß, dass ich ganze Schnittstelle übergeben kann, aber dann muss ich angeben, welche Funktion verwenden. Ich möchte nicht zwei exakt gleiche Prozeduren mit einem unterschiedlichen Aufruf.
Ich kann den zweiten Parameter verwenden, aber auch das ist hässlich.
type
SomeInterfaceMethod = (siPred, siNext)
procedure Move(SomeInt: ISomeInterface; Direction: SomeInterfaceMethod)
begin
case Direction of:
siPred: SomeInt.Pred;
siNext: SomeInt.Next
end;
end;
Vielen Dank für alle Hilfe und Ideen. Die saubere Lösung (für mein Delphi 2006) ist Diegos Visitor. Jetzt bin ich mit einfachen ("hässlich") Wrapper (meine eigene, gleiche Lösung von TOndrej und Aikislave).
Aber die wahre Antwort lautet: "Es gibt keine (direkte) Möglichkeit, die Methoden der Schnittstelle als Parameter zu übergeben, ohne eine Art von Anbieter.