Ho il seguente codiceFunzione generica dell'interfaccia Delphi - C'è un problema?
IProxy<T> = interface
['{1E3A98C5-78BA-4D65-A4BA-B6992B8B4783}']
function Setup : ISetup<T>;
function Proxy : T;
function CastAs<I : IInterface> : IInterface;
end;
C'è un modo per aggirare l'errore del compilatore che viene ricevuto durante la compilazione?
"[DCC errore] Delphi.Mocks.pas (123): i metodi E2535 di interfaccia non devono avere metodi parametrizzati"
Fondamentalmente vorrei avere questa interfaccia essere passati in giro ed essere in grado di lanciare fuori di esso, passando il tipo a cast e restituendo quel tipo. Posso ottenere questo risultato con una classe, tuttavia preferirei passare attorno a un'interfaccia.
Informazione supplementare:
Dire che ho la seguente classe
TInterfaceProxy<T> = class(TBaseProxy<T>)
private type
TProxyVirtualInterface = class(TVirtualInterface)
private
FProxy : TInterfaceProxy<T>;
protected
public
function QueryInterface(const IID: TGUID; out Obj): HRESULT; override; stdcall;
constructor Create(AProxy : TInterfaceProxy<T>; AInterface: Pointer; InvokeEvent: TVirtualInterfaceInvokeEvent);
end;
private
FVirtualInterfaces : TDictionary<TGUID, TProxyVirtualInterface>;
protected
function InternalQueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
function QueryInterface(const IID: TGUID; out Obj): HRESULT; override;
function Proxy : T;override;
function CastAs<I: IInterface> : I;
public
constructor Create;override;
destructor Destroy;override;
end;
Castas funziona bene qui come il cast di nuova richiesta può essere creata una nuova interfaccia virtuale. Ora, se voglio passare questa lezione in modo corretto. Tuttavia se lo richiedo come interfaccia, ovvero TInterfaceProxy<T> = class(TBaseProxy<T>, IProxy<T>)
, non funziona, capiscilo. Non sono d'accordo, ma capisci.
Quindi, come faccio ad aggirare questa restrizione in modo da poter chiamare una funzione CastAs, passare un tipo (qualsiasi tipo di interfaccia per iniziare) ed essere in grado di creare un'interfaccia virtuale da esso?
Grazie. Credo che dovrò passare per il passaggio del TGUID e vivere con quello. Inoltre esporrà la classe esternamente, ma manterrà l'interfaccia "function CastAs (const IID: TGUID): IInterface;" interno. Vorrei poter "programmare nella tua lingua, non in esso" http://programmers.stackexchange.com/questions/2777/what-are-the-key-points-of-code-completo – Jason
Inoltre sì, la tua corretta su ' function CastAs: I; 'un errore sul mio copiare il codice. –
Jason