J'essaie de créer une interface générique qui hérite de l'interface System.ICloneable mais où le type de retour de la méthode Clone() est T. Bien sûr, le type T a besoin de contraintes pour être sûr que c'est un héritage de la classe System.Object mais le code suivant ne fonctionne pas.Type de contraintes de contraintes pour le principe de liskov en C# .NET
public interface ICloneable<T> : System.ICloneable where T : object {
T Clone();
}
Qu'est-ce que je fais mal?
également les contraintes suivantes ne fonctionnent pas:
- où T: System.Object
- où T: classe
comment puis-je utiliser le principe Liskov dans ce cas que dit que vous pouvez réduire votre type de retour, pour résoudre ce problème?
P.S .: Désolé pour mon anglais, si j'ai fait des erreurs. Je ne suis pas un locuteur natif anglais.
Pas besoin d'excuser votre anglais, c'est très bien. –
Incidemment, je vous suggère de marquer le type T comme covariant (mettre le mot "out" avant) et aussi d'ajouter une propriété en lecture seule "T self", ou bien définir une interface ISelf en lecture seule propriété "T soi". Notez que T ne devrait pas être contraint à être ICloneable ni ISelf . Si vous faites cela, on peut avoir des classes Foo et DerivedFoo sans méthode clone publique, et des classes CloneableFoo et CloneableDerivedFoo qui en dérivent, et accepter toute dérivée clonable de Foo comme ICloneable , même si ces dérivées clonables ne partagent aucune classe de base commune . –
supercat