2014-10-27 23 views
5

ho un 'Classe di base' che contengono una 'funzione', che accetta il parametro di tipo 'Array di const' come illustrato di seguito: -Delphi - Come posso passare parametro generico di funzionare che accettano array del parametro const

type 
    TBaseClass = class(TObject) 
    public 
    procedure NotifyAll(const AParams: array of const); 
    end; 

procedure TBaseClass.NotifyAll(const AParams: array of const); 
begin 
    // do something 
end; 

ho un'altra 'classe generica' che deriva dalla 'classe di base' (definito sopra)

type 
    TEventMulticaster<T> = class(TBaseClass) 
    public 
    procedure Notify(AUser: T); reintroduce; 
    end; 

procedure TEventMulticaster<T>.Notify(AUser: T); 
begin 
    inherited NotifyAll([AUser]); ERROR HERE 
end; 

Ogni volta che compilare il codice dà errore che dice:

Tipo di argomento non valido nel costruttore di array di tipo variabile

Che cosa si intende per errore?

risposta

3

Non è possibile passare un argomento generico come variant open array parameter. Il supporto generico della lingua semplicemente non soddisfa questo.

Quello che puoi fare è racchiudere l'argomento generico in un tipo di variante. Ad esempio TValue. Ora, non è possibile superare le istanze TValue come una variante di parametri open array, ma è possibile modificare NotifyAll per accettare una matrice aperta di TValue.

procedure NotifyAll(const AParams: array of TValue); 

volta che hai questo in luogo si può chiamare dal proprio metodo generico in questo modo:

NotifyAll([TValue.From<T>(AUser)]); 

Fondamentalmente ciò che si sta tentando di fare qui è di combinare la compilazione parametro di tempo varianza (generici) con corsa varianza dei parametri temporali. Per quest'ultimo ci sono varie opzioni. I parametri di array aperti varianti sono una di queste opzioni, ma non giocano bene con i generici. L'alternativa che suggerisco qui, TValue, ha un buon riscontro con i generici.

+0

"NotifyAll (const AParams: array of TValue)" potrebbe essere dichiarato come "overload" per gestire entrambi i concetti anche nella classe base. –

Problemi correlati