Pourquoi le tableau met en œuvre IList?
Voir la définition de Système.Tableau classe
public abstract class Array : IList, ...
Théoriquement, je devrais être capable d'écrire ce peu et être heureux
int[] list = new int[] {};
IList iList = (IList)list;
Je doit aussi être capable d'appeler n'importe quelle méthode de la iList
ilist.Add(1); //exception here
Ma question n'est pas pourquoi j'obtiens une exception, mais plutôt pourquoi le Tableau met en œuvre IList?
- Bon question. Je n'ai jamais aimé l'idée de la graisse interfaces (c'est le terme technique pour ce type de conception).
- Le réel (mieux) la question serait pourquoi il prend en charge
IList<T>
.IList
est l'héritage. - Comment pensez-vous qu'il rompt de substitution? Je pense qu'il ne l'est pas. Voir Brians réponse.
- voir: blogs.msdn.com/b/bclteam/archive/2004/11/19/267089.aspx
- Quelqu'un se soucient réellement de LSP? Il semble tout à fait académique pour moi.
- ensuite, vous avez besoin de travailler avec de plus grandes bases de code. Mise en œuvre d'un comportement (héritant de l'interface) et puis tout simplement en ignorant les choses que vous n'aimez pas/ne peut pas soutenir conduit à malodorante, occulté, moulage et enfin: code bogué.
- Vous devez mettre de la complexité quelque part. Disons que vous avez une méthode qui permet de trier un membre de sa catégorie. Avec un seul
IList<>
interface, vous pouvez vérifierIsReadOnly
pour voir si vous pouvez les trier. Si vous avez séparéIRWList<>
etIReadList<>
interfaces, ce type de faire le membre de votre classe? Vous ne pouvez pas utiliserIRWList<>
car alors il ne pouvait pas se tenir en lecture seule des objets, de sorte que vous avez à faire unIReadList<>
et puis jeté àIRWList
de faire votre tri. Voir -- malodorante, occulté casting. - son la collection qui implique la mutabilité pas ses entités qu'elle contient. Vous pouvez faire de votre membre de la classe d'un type qui implémente à la fois IRWList<>, et IReadList<>, utiliser si comme IRWList<> en interne dans votre classe et de l'exposer comme IReadList. Oui, vous avez à mettre de la complexité de quelque part, mais je ne vois pas comment cela s'applique à méconnaître LSP comme un très bon principe de conception (ne savaient pas au sujet de la propriété IsReadOnly bien que ce qui rend IList plus complexe à partir d'un point de vue des consommateurs)
Vous devez vous connecter pour publier un commentaire.
Car un tableau permet un accès rapide à l'index, et
IList
/IList<T>
est la seule collection d'interfaces qui prennent en charge cette. Alors peut-être votre vraie question est "Pourquoi il n'y a pas d'interface pour les constantes des collections avec des indexeurs?" Et à qui je n'ai pas de réponse.Il n'y a pas readonly interfaces pour les collections soit. Et il me manque encore plus qu'une constante de taille moyenne avec des indexeurs de l'interface.
De l'OMI, il devrait y avoir plusieurs (générique) interfaces de collection en fonction des caractéristiques d'une collection. Et les noms ont été différent aussi,
List
pour quelque chose avec un indexeur est vraiment stupide de l'OMI.IEnumerable<T>
ICollection<T>
IList<T>
Je pense que la collection actuelle interfaces sont de mauvaise conception. Mais depuis qu'ils ont des propriétés de vous dire les méthodes qui sont valables(et cela fait partie du contrat de ces méthodes) il ne rompt pas le principe de substitution.
IList<T>
atm puisque c'est la seule interface de collecte avec un indexeur. Et tout le code qui a besoin d'un indexeur utilise doncIList<T>
, en particulier, de nombreuses méthodes linq faire(Sauter,ElementAt,Arrière,...)Clojure
ont mis beaucoup de pensée dans la fabrication de choses cohérentes, maisClojure
est une tout autre plate-forme.add
et ne peut donc pas être remplacé par quelque chose qui ne quand cette capacité est nécessaire.IsFixedSize
etIsReadOnly
propriétés, il a certainement viole le Dire, de Ne pas Poser de principe et Principe de moindre surprise. Pourquoi mettre en place une interface lorsque vous êtes juste de lancer des exceptions pour 4 des 9 méthodes?La section "remarques" de la la documentation pour
IList
ditÉvidemment tableaux de tomber dans la catégorie de taille, de sorte que par la defition de l'interface, cela fait sens.
Array
il n'mettre en œuvre lesAdd
méthode explicitement, ce qui réduit le risque de l'appeler par accident.IList
qui interdit toute modification et ajout/suppression. Ensuite, la documentation n'est plus correct. 😛Parce que pas tous
IList
s sont mutables (voirIList.IsFixedSize
etIList.IsReadOnly
), et les tableaux certainement se comporter comme de taille fixe les listes.Si votre question est "pourquoi faut-il mettre en œuvre une non générique interface", alors la réponse est qu'elles étaient là avant les génériques sont venus le long.
IList
lui-même vous dit qu'il ne peut pas être sujette au changement. Si c'était en fait la garantie d'être mutable et le tableau dit autrement, puis il serait briser la règle.IList<T>
et de ne pas le casser en cas de non-génériqueIList
: enterprisecraftsmanship.com/2014/11/22/...C'est un héritage que nous avons de l'époque où c'était pas clair comment traiter avec lecture seule des collections et de la nécessité ou pas de Tableau est en lecture seule. Il y a IsFixedSize et IsReadOnly drapeaux dans l'interface IList. IsReadOnly indicateur signifie que la collecte ne peut pas être modifié à tous et IsFixedSize signifie que la collection d'autoriser la modification, mais pas de l'ajout ou la suppression d'éléments.
Au moment de la .Net 4.5, il était clair que certains des "intermédiaires" interfaces sont nécessaires pour travailler avec lire seulement les collections, afin
IReadOnlyCollection<T>
etIReadOnlyList<T>
ont été introduit.Voici un excellent billet de blog décrivant les détails: Lecture seule collections .NET
Définition de l'interface IList est "Représente un non-générique collection d'objets qui peuvent être individuellement accessibles par l'index.". Tableau complètement satisfait à cette définition, il doit implémenter l'interface.
Exception lors de l'appel de méthode Add() est "le Système de.NotSupportedException: la Collecte a été de taille fixe" et a eu lieu parce que la matrice ne peut pas augmenter sa capacité de façon dynamique. Sa capacité est définie lors de la création de l'objet array.