Newsgroup: it.comp.lang.delphi
Titolo: TObjectList e generics

Buongiorno a tutti!
nella sezione private di un datamodule vorrei dichiarare una 
MiaListaDiOggetti: TObjectList<T> che vorrei inizializzare tramite una 
procedura Init<T> con MiaListaDiOggetti := TObjectList<T>.create.
Questa cosa non funziona, mi da errore "undeclared identifier 'T'" 
sulla riga della dichiarazione.
Sicuramente sto sbagliando io, qualcuno sa darmi una dritta?
sto usando xe2.
Grazie.
 
-- 
Emanuele Desideri
 
 

 riga della dichiarazione.
 
Posta il codice: non avendo la sfera di cristallo non riesco a capire 
come ï¿œ scritto il sorgente..
 
-- 
morde
Android
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database
 

 scritto il sorgente..
 
Questa la parte di interesse:
TMioDataModule = class(TDataModuleBase)
  private
    { Private declarations }
    ObjectList: TObjectList<T>;  //<---ERRORE Undeclared identifier 'T'
  public
    { Public declarations }
    procedure Init<T>;
  end;
 
procedure TControllerBrowsing.Init<T>;
begin
   Self.ObjectList := TObjectList<T>.Create;
end;
 
-- 
Emanuele Desideri
 
 

 procedure TControllerBrowsing.Init<T>;
sorry
procedure TMioDataModule.Init<T>;
 
-- 
Emanuele Desideri
 
 

   end;
 
Infatti, puoi usare T solo se T e' stato definito nello scope esterno:
 
type
  // introduce T 
  TMiaCLass<T> = class 
    ...
    v: TGenType<T>; // fa riferimento a T
  end;
 
E' un po' come se in un metodo stessi usando un identificatore senza averlo
dichiarato tra i parametri del metodo stesso. 
 
ciao
Giacomo

 Il giorno mercoledï¿œ 19 settembre 2012 12:15:03 UTC+2, Emanuele Desideri ha 

Ciao Giacomo,
si leggendo un po in giro avevo immaginato fosse una cosa del genere.
Perï¿œ se provo a scrivere una cosa tipo:
TMioDataModule<T> = class(TDataModuleBase)
le cose peggiorano anche! :-[
Forse non posso usare i generics con i DataModule?
 
-- 
Emanuele Desideri
 
 

 [...]
 
 
Ci sono due problemi nel codice che hai scritto.
 
Il primo riguarda l'uso che stai facendo dei Generics: nella classe del tuo DataModule ha definito un campo di tipo TObjectList<T>; supponendo che tu non voglia far riferimento a un tipo che si chiama realmente "T", ma che quel "T" rappresenti un segnaposto per la classe effettiva, quest'ultima deve essere obbligatoriamente specificata quando vai a crearne un'istanza.
 
La scrittura TObjectList<T>.Create non ha senso se "T" è un segnaposto per un tipo; devi scrivere TObjectList<TMyClass>.Create, cioè specificare il tipo che deve essere preso in considerazione nella creazione dell'istanza della classe TObjectList, che indica con "T" il tipo dell'oggetto che devi andare a specificare.
 
Puoi utilizzare questa scrittura solo se si trova all'interno di una classe che è anch'essa generica, cioè una classe che nella dichiarazione consente di specificare un tipo tramite un segnaposto (es. "T") che è lo stesso utilizzato per l'ObjectList.
 
Il secondo problema, a mio avviso, è legato al fatto che queste operazioni di "genericità" siano applicate a una classe come il DataModule che, essendo particolare (gestita da Delphi in diversi ambiti), non può essere definita come "generica", perché Delphi non è a conoscenza di quale tipo debba essere specificato per sostituire il segnaposto "T" e riuscire a istanziare il DataModule in questione.
 
Tralasciando questo problema, penso sia sufficiente ricordare che, nel momento in cui si crea l'istanza di una classe generica, il tipo parametrizzato (identificato da "T" o da altro nome) deve essere specificato (o può essere costituito da un altro tipo parametrizzato nella classe generica che lo utilizza).
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 

 Forse non posso usare i generics con i DataModule?
 
Scusa se rispondo in ritardo, anche dopo la spiegazione di Marco, 
cmq purtroppo e' proprio cosi': 
non puoi perche' la classe che tu stai dichiarando
puo' essere istanziata solo se specifichi un tipo da usare al
posto di T. 
 
Questo sembra un problema da poco, anche perche a te serve
proprio poter istanziare un bel TMioDataModule<MiaClasse>
ma il problema e' che il TDatamodule viene anche istanziato
dall'IDE, come tutti gli oggetti su cui stai lavorando
a design time, e qui esce il problema: che classe deve
usare l'IDE per istanziare la sua istanza di oggetto
da mostrarti a design time?
Ecco perche' si inviperisce se provi a cambiare a mano
la dichiarazione in TMioDatamodule<T> = class(TDataModule)
 
Penso che per girare attorno a questo problema dovrebbero
riscrivere un po' troppa roba all'interno dell'IDE...
 
ciao
Giacomo
 
 
 


Ciao Marco,
grazie per la esauriente spiegazione. Ora le cose sono decisamente più 
chiare.
 
-- 
Emanuele Desideri
 
 

 Giacomo
 
Chiederò una revisione del codice delphi B-)
fermi fermi...stavo scherzando :')
Grazie Giacomo.
 
-- 
Emanuele Desideri