Newsgroup: it.comp.lang.visual-basic
Titolo: [?] uso delle classi: operatore new e copia di oggetti

Ciao a tutti,
potreste spiegarmi quale differenza c'è tra:
'B è un oggetto di tipo myclass
dim A as myclass
set a = b
e
dim A as new myclass
set a = b
o
dim A as myclass
set a = new mycalss
set a=b
e in che modo posso creare una copia di B "indipendente" da B
grazie a tutti,
Ciao
Davide

 e in che modo posso creare una copia di B "indipendente" da B
Copiando tutti i membri, oppure , se puoi, sfruttando la persistenza su
disco (vedi sulla guida Persistable)
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


ma così devo definire delle funzioni di uguaglianza per ogni tipo di
oggetto!
oppure c'è un modo per fare un "ciclo" da tutte le proprietà di una classe?
in pratica perdo il 50% dei vantaggi derivati dagli oggetti!
esempio ho un template che mi descrive "un impiegato", cos 50 proprietà.
ne devo inserire 50 tutti uguali tranne la proprietà "Name"
per fare una copia dovrei fare quindi:
dim Nuovo as cImpiegato
set nuovo =new cImpiegato
with nuovo
    .nome=template.nome
    .a=template.a
    .b=template.b
    .c=template.c
    .f=template.f
    .y......=template.y....
    .50=template.50
end with
mi semvra assurdo :(
ciao
Davide

 ne devo inserire 50 tutti uguali tranne la proprietà "Name"
Occhio.
Un oggetto non è un semplice tipo di variabile.
Un oggetto ha, oltre alle proprietà intese, in un certo senso, come
variabili accessibili dall'esterno, anche metodi e proprietà che eseguono
tante cose.
Pensa solo all'oggetto MSCOMM (controllo della porta seriale). Impostando la
proprietà .OutPut a "Ciao", in realtà la stringa "Ciao" viene spedita, ma
non conservata. E così pure, la proprietà .Input non è una caratteristica,
ma un qualcosa di dinamico e che si popola quando arriva qualcosa. Se tu ne
facessi una copia, quanto dovrebbero valere queste due proprietà?
Creare una copia di un oggetto, se non si tratta di un metodo offerto
dall'oggetto stesso, è una cosa di un brutto fuori dal comune.
Infatti nel momento in cui esegui un createobject, o un new, cioè quando
istanzi un oggetto di una classe, avviene una cosa che si chiama Initialize,
e che potrebbe compiere un milione di cose.
Creare un'area di memoria identica a quella dell'oggetto A, e chiamarla B,
non vuole dire creare una copia dell'oggetto, ma una sua 'immagine', sul
funzionamento del quale non abbiamo certezze.
Ad esempio, immagina di creare una copia di un oggetto Form. L'originale si
chiama Form_A, e tu copi tutta la memoria assegnata all'oggetto e lo
indirizzi con Form_B.
Tutto bene, secondo quello che tu vuoi fare.
E invece no, perchè quando viene creata una form, viene segnalato tale
avvenimento al sistema operativo, che deve sapere che questa form esiste. Se
utilizzassi Form_B, quasi sicuramente ci sarebbero grossi problemi.
La tua richiesta nasce da una scarsa conoscenza di cosa è la programmazione
OO, per cui tu intendi una classe come un tipo definito dall'utente, ossia
come una cartella in cui sono presenti una serie di stringhe e numeri. Le
due cose (classe e tipo_utente), sono cose diverse. Per quello che vuoi fare
tu, ti serve un tipo utente (nel qual caso la copia è legittima e corretta).
Ciao
Alberto

     .b=template.b
[SNIP]
Mi spiace ma e' cosi'... puoi incapsulare tutto in un metodo
cImpiegato.Clone che ti restituisce una nuova istanza gia' pronta, ma la
sostanza e' questa; nota che la cosa si complica ulteriormente se alcune
delle proprieta' sono a loro volta riferimenti ad altri oggetti, perche' in
questo caso non e' sufficiente Set a=b ma devi clonare anche b e cosi' via
in maniera ricorsiva.
In .NET, se la cosa ti puo' consolare, c'e' un supporto maggiore per questo
tipo di operazioni, basato sull'interfaccia IClonable e il metodo
MemberwiseClone che e' presente in System.Object e in tutte le classi
derivate (ovvero *tutte*); anche qui pero' se oltre a proprieta' "semplici"
hai un albero di oggetti referenziati allora devi regolarti diversamente;
per esempio sfruttando la serializzazione (che per tornare a VB6, puo'
essere in qualche modo accumunata a Persistable di cui ti accennavo).



vedi sopra...  la type non mi aiuta in quetso caso.. l'engine ha metodi
propri...
ciao
Davide

 essere in qualche modo accumunata a Persistable di cui ti accennavo).
grazie dell'aiuto..
in effetti sto pensando per il futuro di passare a .NET.. ma per ora mi
arrangiocon un "clone"
casalingo
ciao
Davide

 (engine) in modo da avere un altro engine (B)
Allora, come ho scritto nel mio post ("se non si tratta di un metodo offerto
dall'oggetto stesso"), e come ti ha giustamente suggerito Luca, ti conviene
implementare un metodo simile a .Clone
Certo però, che all'interno del metodo clone, l'assegnazione di tutte le
proprietà, una ad una, non te la leva nessuno (e comunque te la consiglio
vivamente: è l'unico modo per avere veramente il controllo di quanto
avviene).
Ciao
Alberto

 mi semvra assurdo :(
io avevo aggiunto alla mia classe un metodo tipo
RendiUguale(sorgente as MiaClasse)
e al suo interno facevo proprio
prop1= sorgente.prop1
prop2= sorgente.prop2
...
propx= sorgente.propx
cos' al posto di fare
classe1= classe2
facevo
classe1.RendiUguale(classe2)
Saluti,
Pusky