2009-07-22 19 views
15

ArrayList declara que implementa las interfaces IList, ICollection y IEnumeralbe.¿Por qué ArrayList implementa IList, ICollection, IEnumerable?

Por qué no sólo implementar IList, porque IList también se deriva de ICollection y ICollection se deriva de IEnumerable.

¿Cuál es el propósito de este tipo de declaración? Hay muchos casos como este en .NET BCL.

Respuesta

7

con el siguiente código:

interface I1 { } 
interface I2 : I1 { } 

class Foo: I2 { } 

Si nos fijamos en Foo través de la reflexión encontrará

class Foo: I2, I1 { } 

Lo que también es válido para compilar y da el mismo resultado.
Así que la diferencia es irrelevante, y al documentar Foo también podría escribirlo con ambas interfaces.

Véase también la pregunta SO: Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

-1
  1. IEnumerable - Para apoyar la instrucción foreach
  2. ICollection - Apoyar añadir el artículo único o múltiple en ArrayList
+0

interrogador no era preguntando para qué eran - preguntaba por qué están explícitamente enumerados como implementados, cuando ya están implementados en virtud de la herencia en IList –

13

No hay diferencia efectiva. Creo que las declaraciones adicionales están ahí para mayor claridad.

Cuando está marcada en el reflector, clases que implementan en el código IList tienen la misma lista de declaración de interfaz como clases que en el código de aplicación declarar todos Ilist, ICollection y IEnumerable.

1

no estoy tan seguro de que tiene ArrayList implementaciones separadas de las interfaces. Considere el siguiente código:

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

El tipo MyClass desarrolla tan sólo la interfaz ISub directamente. Sin embargo, si se compila el código en una asamblea, y luego agrega que el montaje como referencia en otro proyecto, abra el Explorador de objetos y examinar los tipos base de MyClass, que contará con algo como esto:

Base Types 
|- ISub 
| |- IBase 
|- IBase 
|- Object 
Cuestiones relacionadas