Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aggiungere metodo Clone ad una classe

0 views
Skip to first unread message

Andrea [Work]

unread,
Jul 23, 2008, 9:43:02 AM7/23/08
to
Salve a tutti,
ho una mia classe che in fase di inizializzazione, va a caricarsi dei dati
da un Database.

Adesso mi serve clonare tale classe 10/15 volte, ma volevo evitare 10
caricamenti ogni volta. E ovviamente se uso il Set è solo un puntatore alla
medesima classe, mentre a me serve che vivano di vita propria.

Dim objClasse as MiaClasse
Dim ArrayClasse(10) as MiaClasse
Set objClasse = New MiaClasse
objClasse.Init (parametri)
For i=0 to 10
ArrayClasse(i)=objClasse 'senza il Set da errore ovviamente
Next i

E' possibile fare una cosa del genere?
Grazie a tutti

Luca D

unread,
Jul 23, 2008, 11:17:20 AM7/23/08
to
On 23 Lug, 15:43, "Andrea [Work]"

Visto che citi il "set" direi che stiamo parlando di VB6; in questo
caso no, non si può fare...
o meglio puoi, ma devi implementare tu un metodo che, banalmente, copi
tutti i membri uno ad uno e restituisca la nuova istanza.

Function Clone() as MiaClasse
Dim myClone As MiaClasse
Set myClone = New MiaClasse
With myClone
.Membro1 = me.Membro1
.Membro2 = me.Membro2
'[...]
End With
Set Clone=myClone
End Function

Ci sarebbe un sistema meno "ignorante" ma richiederebbe di ridisegnare
la classe su misura per essere clonata: in pratica, internamente, la
classe dovrebbe memorizzare tutte le property non in singole variabili
private come si fa di solito, ma in un unico UDT speculare alla
classe; a questo punto al tuo metodo Clone sarebbe sufficente copiare
quell'unico attributo:

'MiaClasse
Public Type MiaClasseUDT
Membro1 As String
Membro2 As Integer
'[...]
End Type

Private m_PropertyStorage As MiaClasseUDT

Friend Property Get PropertyStorage() As MiaClasseUDT
PropertyStorage = m_PropertyStorage
End Property

Friend Property Let PropertyStorage(ByVal NewValue As MiaClasseUDT)
m_PropertyStorage = NewValue
End Property

Public Property Get Membro1()
Membro1 = m_PropertyStorage.Membro1
End Property

Public Property Let Membro1(ByVal NewValue As String)
m_PropertyStorage.Membro1 = NewValue
End Property

Public Property Get Membro2()
Membro1 = m_PropertyStorage.Membro2
End Property

Public Property Let Membro2(ByVal NewValue As String)
m_PropertyStorage.Membro2 = NewValue
End Property

'[...] altre property

Function Clone() As MiaClasse
Dim myClone As MiaClasse

Set myClone = New MiaClasse
myClone.PropertyStorage = Me.PropertyStorage
Set Clone = myClone
End Function

Chiaramente con tipi semplici funziona bene, con property a loro volta
complesse (tipi o peggio ancora riferimenti ad altri oggetti) la
faccenda si complica perchè dovresti navigare tutta la catena... vedi
tu se ne vale la pena

Luca D

unread,
Jul 23, 2008, 11:29:14 AM7/23/08
to
On 23 Lug, 15:43, "Andrea [Work]"
<andrea.isworkDELET...@gmail.invalid> wrote:

Un'altra alternativa, non è un metodo di clonaggio ma è più facile
rispetto a quella che ho postato un attimo fa: fai un'altra classe che
supporti solo il metodo Init(), identico alla tua classe originaria,
fai in modo pero' che restituisca una collection o un array
(collection è piu' semplice); a questo punto semplicemente fai un
unico accesso al DB nel nuovo metodo Init, ma in un ulteriore ciclo
popola gli n oggetti che ti servono.

'MiaClasseMamma
Public Function Init(ByVal parametri As XXX, ByVal count As Integer)
As Collection

Dim lista As Collection
Dim obj As MiaClasse

'[..] quello che serve per accedere al DB

Set lista = New Collection
Do While Not Recordset.EOF

For i = 1 To count
Set obj = New MiaClasse
'[...] lettura dal recordset
lista.Add obj
Next
Recordset.MoveNext
Loop
'[...] chiusura e pulizia
Set Init = lista

End Function

la chiamata iniziale diventa

Dim objClasseMamma as MiaClasseMamma
Dim listaMiaClasse as Collection
Set objClasseMamma = New MiaClasseMamma
Set listaMiaClasse= objClasseMamma.Init (parametri, 10)

V@nB@sten4eveR80

unread,
Jul 23, 2008, 5:24:09 PM7/23/08
to
Luca D ha scritto:
>...

nn mi intendo di vb6...ma non è quello che si ottiente usando il
costruttore new?

saluti MVB

Andrea [Work]

unread,
Jul 24, 2008, 2:58:37 AM7/24/08
to
Il Wed, 23 Jul 2008 08:29:14 -0700 (PDT), Luca D ha scritto:

> Un'altra alternativa, non è un metodo di clonaggio ma è più facile
> rispetto a quella che ho postato un attimo fa: fai un'altra classe che
> supporti solo il metodo Init(), identico alla tua classe originaria,
> fai in modo pero' che restituisca una collection o un array
> (collection è piu' semplice); a questo punto semplicemente fai un
> unico accesso al DB nel nuovo metodo Init, ma in un ulteriore ciclo
> popola gli n oggetti che ti servono.

Ti ringrazio.
Ora valuto un attimino, potrei anche caricare esternamente i dati nella
classe, cioè non sfruttare la classe interna ma popolare le variabili
esterna

DO until Rs.eof
for i = 0 to 10
arrayClasse(i)= New classe
arrayclasse(i).proprietà1=Rs.fields("campo1").value
arrayclasse(i).proprietà2=Rs.fields("campo2").value
arrayclasse(i).proprietà3=Rs.fields("campo3").value
next i
rs.movenext
loop

Anche perchè questa è la prima bozza del sw, e potrebbe cambiare in corso
d'opera :\.

Wodka40

unread,
Jul 24, 2008, 6:18:34 AM7/24/08
to

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel
messaggio news:1vz6vl4zkryn2$.1iaxouyt7lk75$.dlg@40tude.net...

> Salve a tutti,
> ho una mia classe che in fase di inizializzazione, va a caricarsi dei dati
> da un Database.
>
> Adesso mi serve clonare tale classe 10/15 volte, ma volevo evitare 10
> caricamenti ogni volta. E ovviamente se uso il Set è solo un puntatore
> alla
> medesima classe, mentre a me serve che vivano di vita propria.

...aiuto....chiariscimi!
io ho una classe....la istanzio con new....
prende e si "fà posto"...in memoria ram...gestita non gestita quello che
vuoi !

in memoria ho un puntatore (anche questo chaimalo come vuoi!)
alla sua "zona"(anche questo chiamalo come vuoi...spazio di
indirizzamento...Anselmo...Giuda da Velletri...come vuoi!)

ORA
se vuoi "clonare"....

puoi fare in 2 modi.....Clonare il puntatore.....ne hai 2 che puntano alla
STESSA area

Clonare lo spazio...hai un area ad un diverso puntatore con i medesimi dati!

Io presuppongo che tu voglia fare il secondo:

metodo ad alto livello
....mi leggo i dati UNA VOLTA...li stocco temporaneamente da qualche
parte....creo con new tante classi quanto ne voglio e li assegno i valori
che ho in memoria!
Il fatto che le classi invece che chiamarsi pippo1 pippo 2 pippo3 siano
nella collezione FamigliaDePippis...mi aiuta solo concettualmente a tenere
ordine nei miei incasinati neuroni!
in NET hai un aiuto un po più amichevole....hai l'interfaccia IClonable (se
non ricordo male)...ma se vuoi un deep copy della tua classe custom devi
comunque spippolare lo stesso di codice!

metodo a basso livello....
individui l'area di memoria....ne allochi un altra ...e ci ricopi la
vecchia...il nuovo puntatore è la nuova classe
Se pò fà in vb6?...certo che no!....o meglio.... devi spippolare di
API....io non c'ho provato con una classe(mi son fermato ad una
variabile...e solo per pura voglia di provare!)....
però questo esempio lo fà per copiare un array in un altro
http://www.vb-helper.com/howto_copy_memory.html
in C++ sarebbe un "pelino più facile"....
in VB.net non so....
però visto che si parla di classi e di spazio di memoria managed....ci sarà
qualche namespace nell'immenso mare del framework che ricopierà zone di
memoria allocata!...o no?...boh!

;-)


Andrea [Work]

unread,
Jul 24, 2008, 8:48:20 AM7/24/08
to
Il Thu, 24 Jul 2008 12:18:34 +0200, Wodka40 ha scritto:

> metodo ad alto livello
> ....mi leggo i dati UNA VOLTA...li stocco temporaneamente da qualche
> parte....creo con new tante classi quanto ne voglio e li assegno i valori
> che ho in memoria!

Infatti è quello che farò :-)
Farò la mia select esterna alla classe, inizializzo la classe senza farle
caricare nulla, e setto le property a mano.
Anche perchè saranno 8/10 property, solo che la select da cui pescano è
abbastanza complessa e non istantanea.

Grazie

andrea palazzi

unread,
Jul 24, 2008, 10:17:51 AM7/24/08
to

"Wodka40"

> in memoria ho un puntatore (anche questo chaimalo come vuoi!)
> alla sua "zona"(anche questo chiamalo come vuoi...spazio di
> indirizzamento...Anselmo...Giuda da Velletri...

appena ci vediamo (zio gibi, datti una mossa per settembre, che sono gia'
prenotato per lezioni di storia al grillino...), mi spieghi per filo e per
segno chi e' giuda da velletri. sembra simpatico. tradisce per trenta
caciotte? :)

0 new messages