Cela serait-il possible? (Je n'ai pas vs. 2010, je ne peux donc pas l'essayer moi-même, désolé) Si je comprends bien, vous pouvez l'utiliser pour mettre en œuvre la covariance et la contraviance dans le même interface. p> p>
3 Réponses :
Non, vous ne pouvez pas. Dans votre exemple ilist
IList
dans code> /
out code> pour être covariant / contravaret. Il n'est pas possible de le faire juste en héritant une interface covarienne. P>
Eh bien, votre question est légèrement déroutante en raison du type existant vous pouvez même le modifier pour étendre ilist
ienumerable
public void Foo(IWritableList<string> x) { ... }
IMyList<object> objects = new MyList<object>();
Foo(objects);
Cela compilit certainement mais ce ne serait pas co / contra-variant. isimplelist
isimplelist
Je vais mettre à jour ma réponse pour être plus précis - désolé, pensez toujours tout cela à travers.
Un point n'est pas encore mentionné: en plus de fractionnement des accessoires de lecture de covariants et des accesseurs d'écriture Contravariant, on pourrait également bénéficier de fractionnement des membres tels que le compte, qui sont indépendants de type. Incidemment, il serait possible de trier un objet ressemblant à une liste sans tenir compte du type d'objet contenu dans celui-ci si l'interface fournit des méthodes de comparaison (Index1, Index2) et Swapat (Index1, Index2).
Si une mise en œuvre d'une propriété de lecture en lecture était également considérée comme une mise en œuvre d'une propriété en lecture seule, on pourrait ajouter une forme utile de la covariance de la liste et de la contrevenance en présentant une iList (de t) dérive de IReadhablier (of Out T) et iaddlelist (de en t). À condition que ces interfaces comprenaient simplement des éléments présents dans IList (de T) avant leur définition, le code mis en œuvre ilist (de t) appliquerait automatiquement ces autres membres. Malheureusement, pour IREADABLICELIST pour être covariant, il faudrait disposer d'une propriété indexer en lecture seule; La mise en œuvre de la propriété lecture-écriture dans IList n'a pas pu être substituée. Avoir IList (of T) hériter d'une irrablière utilisable (of Out T) briserait ainsi toutes les implémentations d'IList (de T). P>