2009-07-22 18 views
15

ArrayList dichiara che implementa le interfacce IList, ICollection e IEnumeralbe.Perché ArrayList implementa IList, ICollection, IEnumerable?

Perché non solo implementare IList, perché IList deriva anche da ICollection, e ICollection è derivato da IEnumerable.

Qual è lo scopo di questo tipo di dichiarazione? Ci sono molti casi come questo in .NET BCL.

risposta

7

Con questo codice:

interface I1 { } 
interface I2 : I1 { } 

class Foo: I2 { } 

Se si guarda alla Foo attraverso la riflessione troverete

class Foo: I2, I1 { } 

valido anche per compilare e dà lo stesso risultato.
Quindi la differenza è discutibile, e nel documentare Foo si potrebbe anche scriverlo con entrambe le interfacce.

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

-1
  1. IEnumerable - Per sostenere l'istruzione foreach
  2. ICollection - Per sostenere aggiungere l'elemento singolo o multiplo in arraylist
+0

interlocutore non era chiedendo a cosa servivano - stava chiedendo perché sono esplicitamente elencati come implementati, quando sono già implementati in virtù dell'ereditarietà di IList –

13

Non c'è differenza efficace. Credo che le dichiarazioni extra ci siano per chiarezza.

Se selezionata in Reflector, classi che implementano nel codice IList hanno la stessa lista di dichiarazione interfaccia come classi che nel codice dichiarare che costituiscono gli Ilist, ICollection e IEnumerable.

1

Io non sono così sicuro che ArrayList ha implementazioni separati delle interfacce. Si consideri il seguente codice:

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

Il tipo MyClass implementa direttamente solo l'interfaccia ISub. Tuttavia, se si compila il codice in un assieme, e poi aggiunge che il montaggio come riferimento in un altro progetto, aprire il Visualizzatore oggetti e di esaminare i tipi di base per MyClass, sarà caratterizzato da qualcosa di simile:

Base Types 
|- ISub 
| |- IBase 
|- IBase 
|- Object 
Problemi correlati