Newsgroup: it.comp.lang.visual-basic
Titolo: ICloneable: 2 dubbi

Ciao a tutti,
come da oggetto ho un dubbio sull'interfaccia IClonable all'interno di
un oggetto:
1 - Perchè si implementa l'oggetto IClonable?



     Mi spiego: se faccio il metodo in A e lo chiamo  Public Clone()
as Object, ritorno una stanza identica di A, senza dichiarare
Implements ICloneable e senza dichiarare il metodo  Public Function
Clone() As Object Implements System.ICloneable.Clone
funziona alla stessa maniera?
2- Ho fatto un metodo clone in una classe che deve essere ereditata:
            Public MustOverride Function Clone() As Object Implements
System.ICloneable
Quando cerco di fare l'overrides del metodo nella classe "figlia" il
compilatore virtuale di VS mi dà il seguente avviso:
System.IClonable.clone è già implementato dalla classe base "pippo".
Prevista nuova implementazione di Function
Sapreste dirmi il perchè?
Grazie a chiunque posa darmi una mano. Siete sempre molto utili,
Babbomarcelo.


Le interfacce non sono altro che metodi "standard" per fare le cose!
Nulla toglie che tu voglia fare l'estroso e bypassare le interfacce e
creartene di proprie!
Detto questo
quanto dichiaro una classe (non mi piace usare la parola creare!)...se
è complessa ho un evidente problema: se mi necessità di clonare
l'oggetto istanziato come fare?
NET delega a me l'incombenza e io stabilisco le regole per istanziare
un nuovo oggetto clone del vecchio (poprietà di default...passaggio di
valori....etc etc)
quando io invoco
Solido3d.clone si apre un mondo!...non clono il riferimento...clono
TUTTO l'oggetto!
ad esempio dovrei istruire tutte le primitive per rifare il medesimo
oggetto...e tutti i valori per dargli il medesimo aspetto!
Mica cosa da poco!
Usando l'interfacce tutto rimane omogeneo...e posso fare
Bitmap.clone...o Fattura.clone.....o MovimentoMagazziono.clone...o
Suono.clone....
mica poco come comodità!

 Mica cosa da poco!
Oppure all'interno del metodo Clone()As Object Implements
System.ICloneable.Clone mi basta fare l'istanza di un nuovo oggetto
solido3d e sono a posto? (quindi mi ritorna tutto come il solido che
stò clonando)
esempio:
Public class solido3d
       Implements ICloneable
        Public a as integer
        public sub new()
        end sub
        Puclic function clone()As Object Implements
System.ICloneable.Clone
               dim s as solido3d = new solido3d()
               return s
        end function
end Class
Se io avessi messo a = 10, nel caso in cui faccio il clone richiamando
solido3d.clone, l'oggetto che mi ritorna ha a = 10? Oppure devo
procedere così:
    Puclic function clone()As Object Implements
System.ICloneable.Clone
               dim s as solido3d = new solido3d()
               s.a = me.a
               return s
        end function
Grazie mille ancora per la risposta e per l'attenzione,
Babbomarcelo

Ad esempio ho implementato una classe solido3d contenente alcuni
oggetti, mi serve per diversi motivi il suo clone (esempio un button
"COPIA SOLIDO"),
[...]Oppure all'interno del metodo Clone()As Object Implements
System.ICloneable.Clone mi basta fare l'istanza di un nuovo oggetto
solido3d e sono a posto? (quindi mi ritorna tutto come il solido che
stò clonando)
...
Beh, no.
Se crei una nuova istanza della stessa classe, naturalmente ti restituira' 
un nuovo oggetto che non ha nulla in comune con l'oggetto originale, se non 
la classe di apparteneza.
E' compito tuo scrivere il codice, al'interno del metodo Clone, per fare in 
modo che le proprieta' di un oggetto vengano "clonate" e riportate anche 
nell'altro.
Cioe, come hai scritto tu nel tuo esempio,
...
 >   Puclic function clone()As Object Implements System.ICloneable.Clone
               dim s as solido3d = new solido3d()
               s.a = me.a
               return s
        end function
....
Ciao... Maurizio


un buon libro ti sarebbe di aiuto....
ad esempio anche se parla del net 1.qualcosa la teoria è sempre valida
"Francesco Balena Visual Basic.net nozioni di base"
pag 194
"...in Visual basic .Net qualsiasi entità è un ogetto.Una conseguenza
di tale definizione è che l'assegnazione di una variabile a un'altra
variabile genrea due variabili che puntano al medesimo oggetto e non a
due copie distinte dello stesso (a meno di utilizzare tipi valore
invece di tipi riferimento),
Generalmente per ottenere una copia del dato bisogna invocare un
particolare metodo esposto dalla classe.
Nel mondo .NET una classe dovrebbe implementare l'interfaccia
ICloneable per esporre l'unico metodo, Clone, per far sì che il mondo
estreno sappia come creare una copia delle istanze.
"....
si avventura in un esempio....
Class Employee
Implements ICloneable
'per far prima altrimenti usare la sintassi delle proprietà
Public FirstName as String
Public LastName as String
Public Boss as Employee
Sub New(byVal firstName as string, ByVal Lastname as string)
me.firstname=firstname
me.lastname=lastname
End Sub
'interfaccia
Public Function Clone() as Object Implements ICloneable.Clone
'Crea nuovo Employee
dim e as New Employee(firstname,Lastname)
'solo che il costruttore genera la classe MA NON assegna tutti i
valori!
'quelli che restano fuori devi assegnarli manualmente
e.boss=Me.boss
return e
End function
Balena si sofferma sul fatto che potresti usare memberwiseclone per
non copiarti manualmente le proprietà
e tutto si semplificherebbe con
Public Function Clone() as Object Implements ICloneable.Clone
return me.membrewiseClone
End function
l'uso a questo punto è semplice
Dim Pippo as new Employee("Pippo", "De pippis")
Dim Paperino as new Employee("Paolino", "Paperino")
Dim Paperone as new Employee("Paperone", "De Paperoni")
e anche assegnare un superiore
Paperino.Boss=Paperone
e per clonare...se hai per fortuna/sfortuna anche messo lo Strict On
Dim Paperinik as Employee=DirectCast(Paperino.Clone, Employee)
MA I PROBLEMI NON SON FINITI QUI
Vuoi fare una shallow copy o una deep copy?
Ossia vuoi creare SOLO una copia dell'oggetto in questione
O ANCHE
una copia degli oggetti secondari a cui fa riferimento???
Se vuoi usare una deep copy....memberwiseclone NON ti aiuta!
Si dice "copiare il grafo" (lo dice Balena...non so se si dice
davvero)
e quello lo devi fare a manina!
Clonandoti tutti gli oggetti secondari
Ora mi fermo e ti rimando alla lettura di un qualsiasi libro di
NET...perchè non è finita qui!
eh eh eh!