240 votes

Pourquoi aucun ICloneable<T>?</T>

Y a-t-il une raison particulière pourquoi un générique `` n’existe pas ?

Il serait beaucoup plus à l’aise, si je n'avais pas besoin de transtyper je clone quelque chose à chaque fois.

151voto

Marc Gravell Points 482669

En plus de Andrey réponse (dont je suis d'accord avec, +1) - ICloneable est fait, vous pouvez également choisir la mise en œuvre explicite de rendre public l' Clone() retour typé objet:

public Foo Clone() { /* your code */ }
object ICloneable.Clone() {return Clone();}

Bien sûr, il y a un deuxième problème avec un générique ICloneable<T> - l'héritage.

Si j'ai:

public class Foo {}
public class Bar : Foo {}

Et j'ai implémenté ICloneable<T>, alors dois-je mettre en oeuvre ICloneable<Foo>? ICloneable<Bar>? Vous démarrez rapidement la mise en œuvre d'un lot à l'identique des interfaces... Comparer à un casting... et est-il vraiment si mauvais?

118voto

Andrey Shchekin Points 7740

ICloneable est considéré une API mauvaise maintenant, puisqu’il ne précise pas si le résultat est une profonde ou une copie superficielle. Je pense que c’est la raison pour laquelle ils ne s’améliorent pas cette interface.

Vous pouvez probablement faire une méthode d’extension clonage typée, mais je pense qu’il faudrait un nom différent, étant donné que les méthodes d’extension sont moins prioritaires que les originaux.

18voto

David Kean Points 3353

J'ai besoin de demander, exactement ce que voulez-vous faire avec l'interface autre que de la mettre en œuvre? Les Interfaces sont généralement seulement utile lorsque vous lancez pour elle (c'est à dire est-ce à l'appui de classe 'IBar"), ou ont des paramètres ou des poseurs qui le prendre (c'est à dire je prends un 'IBar'). Avec ICloneable - nous sommes allés à travers l'ensemble de la structure et a échoué à trouver une seule utilisation qui était autre chose qu'une mise en œuvre. Nous avons également échoué à trouver toute utilisation dans le 'monde réel' qui n'est autre chose que de le mettre en œuvre (dans le ~de 60 000 applications que nous avons accès à l').

Maintenant, si vous souhaitez juste d'appliquer un modèle que vous voulez de votre "clonable" des objets à mettre en œuvre, c'est tout à fait amende à l'utilisation et à aller de l'avant. Vous pouvez également décider exactement ce que le "clonage" signifie pour vous (c'est à dire profonde ou peu profonde). Toutefois, dans ce cas, il n'y a pas besoin de nous (BCL) de la définir. Nous n'définir des abstractions de la BCL quand il y a un besoin d'échanger des instances de taper comme cette abstraction entre les indépendants les bibliothèques.

David Kean (BCL Équipe)

14voto

TcKs Points 13249

Je pense que la question « pourquoi » est inutile. Il y a beaucoup de classes/interfaces/etc... qui est très utile, mais ne fait pas partie de la bibliothèque de base .NET Frameworku.

Mais, surtout, vous pouvez le faire vous-même.

10voto

Mauricio Scheffer Points 70470

Il est assez facile d’écrire l’interface vous-même si vous en avez besoin :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X