Newsgroup: it.comp.lang.visual-basic
Titolo: FAQ: Vettore di oggetti tutti uguali

Probabilmente è faq o neanche quella visto che è stupida.
Vorrei creare un vettore di oggetti tutti uguali. Per ora ho usato
una Collection ma ovviamente gli item possono essere di qualsiasi
tipo.
Se uso un vettore del tipo
    Dim arr() As miaClasse
devo fare ogni volta una "ReDim Preserve" per aggiungere e per cancellare è
un casino.
Vorrei un oggetto che fosse semplicemente una lista di oggetti tutti uguali,
quindi
possa usare i classici metodi Add, Remove, Count.

 possa usare i classici metodi Add, Remove, Count.
Ti crei una classe con i suoi metodi Add, Remove e Count che
aggiungono, rimuovono e contano elementi ad un membro privato
di tipo collection:
<code>
private coll_ as collection
[...]
public sub Add(byref item as miaClasse)
    coll_.add item
end sub
[...]
</code>
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 di tipo collection:
[SNIP]
Esatto: in questo caso non e' una cattiva idea, specie la prima volta, usare
il wizard per le classi fornito con VB, che permette di creare facilmente
una classe Collection specializzata, e soprattutto aggiunge alcuni membri
particolari (il famigerato NewEnum per i cicli for each) che non sono cosi'
ovvi
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 </code>
Ma alla fine è pur sempre un oggetto Collection.
In altre parole, quando faccio coll_.item(x).<proprietà di miaClasse>
il codice non viene rallentanto? Non ricordo il termine, ma sembra che
in questo caso il VB, non sapendo di che classe sia coll_.item(x), non
può sapere se è dotato della proprietà specificata e così aggiunge del
codice per verificarlo.
Vorrei evitare questo rallentamento!

 codice per verificarlo.
Si, ma tu non farai mai accesso ai membri degli oggetti direttamente da
coll_, solo all'intero oggetto.
Quello che vedrai invece dall'esterno e' sempre
MiaClasseColl.Item(x).Proprieta', dove Item qui e' dichiarata As MiaClasse,
non piu' genericamente As Object; come dicevo nell'altro messaggio, fatti
generare una classe collection di esempio dal wizard, cosi' puoi vedere come
viene trattato il codice.
Un minimo di overhead lo hai comunque, nel doppio passaggio tra collection
interna e la tua classe (quindi solo quando viene risolto .Item, non tutte
le proprieta' conseguenti), ma e' inevitabile... altrimenti puoi utilizzare
una delle classi, che credo si trovino sul Sito Comune, che replicano
interamente il funzionamento della collection, utilizzando internamente
array, algoritmi di hashing per le Key ecc. ma anche qui, in mancanza di
ereditarieta', sei costretto copiare interamente la classe e a modificarne
il codice ogni volta che vuoi specializzarla su oggetti diversi.


 ogni volta che vuoi specializzarla su oggetti diversi.
Una precisazione:
l'ereditarietà in questo caso non viene in aiuto, a meno di
"sporchi" trucchi come derivare *ogni* classe da una classe
base comune (come in Java dove tutte le classi derivano da
Object), oppure utilizzare Variant.
L'unico modo pulito di riutilizzare codice di questo tipo è la
programmazione generica (i template del C++ e
prossimamente -si spera- del C#).


 Object)
[SNIP]
Hai ragione, in effetti davo per scontato questo; che per esempio e' quello
che succede anche in Delphi e in .NET


 esempio e' quello che succede anche in Delphi e in .NET
Succede in linguaggi che mancano dell'ereditarietà multipla e
di supporto per la programmazione generica.
