2009-07-22 11 views
15

ArrayList erklärt, dass es die Schnittstellen IList, ICollection und IEnumeralbe implementiert.Warum ArrayList IList, ICollection, IEnumerable implementieren?

Warum implementieren nicht nur IList, weil IList auch von ICollection stammt und ICollection von IEnumerable abgeleitet ist.

Was ist der Zweck dieser Art von Deklaration? Es gibt viele Fälle in .NET BCL.

Antwort

7

Mit dem folgenden Code:

interface I1 { } 
interface I2 : I1 { } 

class Foo: I2 { } 

Wenn Sie durch Reflexion zu buchen, Foo werden Sie

class Foo: I2, I1 { } 

finden, die auch gültig ist zu kompilieren und das gleiche Ergebnis.
Also der Unterschied ist mot, und in der Dokumentation von Foo können Sie es auch mit beiden Schnittstellen schreiben.

Siehe auch die Frage SO: Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

-1
  1. IEnumerable - Um die foreach-Anweisung
  2. ICollection zu unterstützen - Arraylist einzelne oder mehrere Artikel in
+0

Fragesteller war nicht zu fragen, wofür sie waren - fragte, warum sie explizit als implementiert aufgeführt sind, wenn sie bereits aufgrund der Vererbung auf IList implementiert sind –

13

Es gibt keine wirksame Unterschied hinzufügen zu unterstützen. Ich glaube, dass die zusätzlichen Erklärungen zur Klarheit da sind.

Wenn in Reflector geprüft, Klassen, die im Code implementieren IList haben die gleiche Schnittstelle Deklarationsliste als Klassen, die in Code deklarieren alle Ilist, ICollection und IEnumerable Umsetzung.

1

Ich bin nicht so sicher, dass ArrayList getrennte Implementierungen der Schnittstellen. Betrachten Sie den folgenden Code ein:

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; } 
} 

Der MyClass Typ implementiert nur die ISub Schnittstelle direkt. Wenn Sie jedoch den Code in eine Baugruppe, kompilieren und dann diese Baugruppe als Referenz in einem anderen Projekt hinzuzufügen, öffnen Sie den Objektbrowser und untersuchen Sie die Basistypen für MyClass, wird es so etwas wie diese Funktion:

Base Types 
|- ISub 
| |- IBase 
|- IBase 
|- Object 
Verwandte Themen