È possibile passare il metodo dell'interfaccia come parametri?Metodo dell'interfaccia passata come parametro
Sto cercando qualcosa di simile:
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;
Ma non funziona perché:
E2010 tipi incompatibili: 'TMoveProc' e 'di procedura, puntatore non tipizzata o di parametri non tipizzato'
Naturalmente posso eseguire il metodo privato per ogni chiamata, ma questo è brutto. C'è un modo migliore?
Delphi 2006
Edit: So che posso passare tutta l'interfaccia, ma poi devo specificare quali l'uso della funzione. Non voglio due esattamente le stesse procedure con una chiamata diversa.
Posso usare il secondo parametro, ma anche quello è brutto.
type
SomeInterfaceMethod = (siPred, siNext)
procedure Move(SomeInt: ISomeInterface; Direction: SomeInterfaceMethod)
begin
case Direction of:
siPred: SomeInt.Pred;
siNext: SomeInt.Next
end;
end;
Grazie a tutti per l'aiuto e le idee. La soluzione pulita (per il mio Delphi 2006) è il visitatore di Diego. Ora sto usando un semplice ("brutto") wrapper (la mia stessa, la stessa soluzione di TOndrej e Aikislave).
Ma la vera risposta è "non esiste un modo (diretto) per passare i metodi di interfaccia come parametri senza un qualche tipo di fornitore.
Il codice in TSomeObject.Move appare come un caso d'uso per un modello di "strategia". MoveProc potrebbe essere un metodo di una classe TAbstractMoveProcStrategy, in cui le sottoclassi implementano il comportamento richiesto nel metodo Move. TMovePredStrategy/TMoveNextStrategy avrebbe diversi proc di spostamento. – mjn