Question

Salut Folks je dois clone profond des objets personnalisés qui référence à d'autres objets personnalisés et ceux-ci peuvent faire référence à d'autres Cust ... et ainsi de suite vous voyez l'idée.

Je suis juste au stade de la documentation et la conception au moment si wan't pour l'obtenir droit.

Q1. Pourquoi mettre en œuvre ICloneable et retourner un objet lorsque vous pouvez écrire une fonction personnalisée fortement typé qui retourne le type d'objet correct clonés?

Q2. Les objets ne sont pas énormes et je ne me dérange pas de faire la levée de lourds initial copie chaque élément, mais étant je paresseux pourrait MemberwiseClone l'objet puis ajoutez le code spécifique pour les membres référencés à nouveau cela créerait un besoin pour la coulée, de sorte que ce qui est plus effiecient en termes de cycles cpu?

Toutes les pensées, opinions et réflexions bienvenues.

Était-ce utile?

La solution

Voir 536349 pour des raisons de ne pas mettre en œuvre ICloneable; En gros, vous pouvez définir vos propres voir (fortement typé) l'interface et l'utiliser, je ne pas de problèmes avec elle aussi longtemps que correctement les documents qu'il crée des copies profondes.

Autres conseils

Le but d'une interface est de permettre aux gens de fonctionner sur des objets qui prennent en charge l'interface sans avoir à se soucier de ce que les objets sont en réalité. Sans savoir ce que iCloneable.Clone va réellement faire sur un objet donné, sachant simplement qu'un objet prend en charge ICloneable est assez inutile.

Il aurait été utile pour les types de collecte d'avoir une méthode de BaseClone protégée, et pour eux d'avoir un type dérivé qui le rendre public (faire les choses de cette façon permettrait un à Derive types Cloneable et non Cloneable des collections ). Avoir quelque chose comme une méthode Dictionnaire soutien Clone serait mieux que d'inclure un constructeur de copie, puisque l'argument d'un constructeur de copie pourrait être un type qui dérive de dictionnaire, mais était significativement différente en interne.

Pour une interface de clonage soit utile, il faudrait inclure une propriété par quels éléments pourraient dire comment ils se sentaient sur le clonage (par exemple -1- le type est immuable et ne nécessite pas le clonage, le clonage d'un type -2- briserait probablement il; -3- le type de clonage supports), et précise qu'une opération DeepClone vérifierait tous les objets pour vous assurer qu'ils ne sont pas l'esprit le clonage étant, et si tel était le cas, il serait clone tous les objets mutables imbriqués. Malheureusement, rien de tel qui existe dans le cadre.

Avoir une interface pour indiquer qu'un objet est cloneable peut être utile si un ensemble de types dérivés inclut des versions Cloneable et non Cloneable. S'il est possible que les dérivés d'un type peuvent ne pas être en mesure de soutenir le clonage, les méthodes de clonage de ce type doivent être protégés; une version cloneable du type devrait être dérivé de celui-ci, mais d'autres types devrait tirer des versions non Cloneable.

Par exemple, on pourrait avoir un type Widget avec des types dérivés, y compris CloneableWidget et SuperWidget (ce qui est cloneable). SuperWidget pourrait avoir un CloneableSuperWidget de type dérivé (ainsi que d'autres qui BREAKSi clonés). Si l'on veut être en mesure de travailler avec tous les dérivés Cloneable de type Widget, il faudrait vérifier à la fois que les objets de dérive Widget, et que ce soit cloneable. Ajout ICloneable aux dérivés Cloneable permettrait une à vérifier pour un tel objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top