2009-07-22 7 views
15

ArrayList déclare qu'il implémente les interfaces IList, ICollection et IEnumeralbe.Pourquoi ArrayList implémente IList, ICollection, IEnumerable?

Pourquoi non seulement mettre en œuvre IList, car IList est également dérivé de ICollection et ICollection est dérivé de IEnumerable.

Quel est le but de ce genre de déclaration? Il y a beaucoup de cas comme ceci dans .NET BCL.

Répondre

7

Avec le code suivant:

interface I1 { } 
interface I2 : I1 { } 

class Foo: I2 { } 

Si vous regardez Foo par la réflexion, vous trouverez

class Foo: I2, I1 { } 

Ce qui est également valable pour compiler et donne le même résultat. Donc, la différence est discutable, et en documentant Foo, vous pourriez aussi bien l'écrire avec les deux interfaces.

Voir aussi la question SO: Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

-1
  1. IEnumerable - Pour appuyer l'instruction foreach
  2. ICollection - Pour soutenir ajouter l'article unique ou multiple dans arraylist
+0

questionneur n'a pas été demandant pourquoi ils étaient pour - demandait pourquoi ils sont explicitement répertoriés comme étant mis en œuvre, quand ils sont déjà mis en œuvre en vertu de l'héritage sur IList –

13

Il n'y a aucune différence. Je crois que les déclarations supplémentaires sont là pour plus de clarté.

Quand elle est cochée dans le réflecteur, classes dans le code à mettre en œuvre IList ont la même liste de déclaration d'interface que les classes qui dans le code d'application tous déclarent Ilist, ICollection et IEnumerable.

1

Je ne suis pas sûr que ArrayList a des implémentations distinctes des interfaces. Considérez le code suivant:

public interface IBase 
{ 
    int SomeInt { get; set; } 
} 

public interface ISub : IBase 
{ 
    int SomeOther { get; set; } 
} 

public class MyClass : ISub 
{ 
    public int SomeOther { get; set; } 
    public int SomeInt { get; set; } 
} 

Le type MyClass implémente uniquement l'interface ISub directement. Toutefois, si vous compilez le code dans un ensemble, puis ajouter cette assemblée comme référence dans un autre projet, ouvrez l'Explorateur d'objets et d'examiner les types de base pour MyClass, il mettra en vedette quelque chose comme ceci:

Base Types 
|- ISub 
| |- IBase 
|- IBase 
|- Object 
Questions connexes