Perché dovrei implementare ICloneable in c #?

Puoi spiegarmi perché dovrei ereditare da ICloneable e implementare il metodo Clone() ?

Se voglio fare una copia profonda, non posso semplicemente implementare il mio metodo? Diciamo MyClone() ?

Perché dovrei ereditare da ICloneable ? Quali sono i vantaggi? È solo questione di rendere il codice “più leggibile”?

    Non dovresti. Microsoft consiglia di non implementare ICloneable perché ICloneable non vi è alcuna chiara indicazione se il metodo Clone esegue un Clone “profondo” o “superficiale”.

    Vedi questo post sul blog di Brad Abrams nel 2003 (!) Per ulteriori informazioni.

    L’interfaccia ICloneable per sé non è molto utile, il che vuol dire che non ci sono molte situazioni in cui è utile sapere che un object è clonabile senza sapere nient’altro a riguardo. Questa è una situazione molto diversa da eg IEnumerable o IDisposable ; ci sono molte situazioni in cui è utile accettare un object IEnumerable senza sapere altro che come enumerarlo.

    D’altra parte, ICloneable può essere utile se applicato come un vincolo generico insieme ad altri vincoli. Ad esempio, una class base potrebbe supportare utilmente un numero di derivati, alcuni dei quali potrebbero essere clonati utilmente e alcuni non potrebbero. Se il tipo base stesso esponeva un’interfaccia di clonazione pubblica, qualsiasi tipo di derivato che non poteva essere clonato avrebbe violato il Principio di sostituzione di Liskov. Il modo per evitare questo problema è di avere il clone di supporto del tipo di base utilizzando un metodo protetto e consentire ai tipi derivati ​​di implementare un’interfaccia di clonazione pubblica nel modo che ritengono opportuno.

    Una volta che è stato realizzato, un metodo che vuole accettare un object di tipo WonderfulBase e deve essere in grado di clonarlo, potrebbe essere codificato per accettare un object WonderfulBase che supporta la clonazione (usando un parametro di tipo generico con tipo base e ICloneable vincoli). Sebbene l’interfaccia ICloneable non sia in grado di indicare la clonazione profonda o superficiale, la documentazione di WonderfulBase indicherebbe se Cloneable WonderfulBase debba essere clonato in profondità o in profondità. Essenzialmente, l’interfaccia ICloneable non realizzerebbe nulla che non sarebbe stato ottenuto definendo ICloneableWonderfulBase , tranne che eviterebbe di dover definire nomi diversi per ogni class di base clonabile differente.

    ICloneable è uno di quegli artefatti nel BCL che è stato controverso. Non c’è una vera ragione per implementarlo. Detto questo, se creerò un metodo di ICloneable , ICloneable e fornirò la mia versione fortemente ICloneable di Clone .

    Il problema con ICloneable non è mai indicato se Clone fosse una copia superficiale o profonda che sono cose molto diverse. Il fatto che non ci sia ICloneable potrebbe essere un’indicazione sul pensiero di Microsoft su ICloneable

    Matt è corretto, non usarlo. Crea il tuo metodo Copy() (o un nome simile) e rendi perfettamente chiaro nella tua API pubblica se il tuo metodo sta creando una copia profonda o superficiale del tuo object.