2010-07-11 16 views

Respuesta

17

Sí, no hace ninguna diferencia en este caso. En algunos casos, puede marcar, si está utilizando una clase base que ya implementa una interfaz pero desea volver a implementarla usted mismo explícitamente, pero en este caso no hay una clase base (que no sea la object implícita) y se habría comportado exactamente de la misma manera.

Al contrario de lo que recuerdo, no creo que haya una diferencia en la forma en que se representa la clase en los metadatos, ya sea que el código declare explícitamente todas las interfaces o no. He aquí un ejemplo:

interface IFoo {} 
interface IBar : IFoo {} 

class FooBar1 : IBar {} 
class FooBar2 : IBar, IFoo {} 

Tanto ildasm y el reflector mostrar la misma información para FooBar1 y FooBar2 ... se nota tanto de ellos implementar IBar y IFoo.

En otras palabras, no podemos decir si el código fuente original para List<T> realmente especifica todas las interfaces o no. Quizás sí, quizás no, pero no importa de ninguna manera.

EDITAR: Para completar, también verifiqué los casos en los que está extendiendo dos interfaces con otra interfaz. No puedo encontrar una diferencia en los metadatos en ese caso, tampoco. Estoy seguro de recordar alguna situación en la que era evidente, pero no puedo encontrarla ahora.

+0

Entonces ya que no hay una clase base. No hace la diferencia. Entonces, ¿por qué los desarrolladores heredaron esas dos interfaces 'otra vez'? –

+0

@Marco: ver mi respuesta editada. –

+0

Entendido. Muchas gracias. Eso fue rápido. –

5

Sí, lo haría. IList<T> en sí mismo implementa los otros dos.

El navegador de objetos muestra todos los interfaces de los implementos de clase, ya sea directamente (IList<T>) o indirectamente (ICollection<T>, IEnumerable<T>, a través IList<T>).

+0

¿quiere decir que es solo un truco el navegador de objetos para facilitarnos las cosas? –

+0

Bueno, si quieres decirlo de esa manera. Realmente creo que es porque el código del navegador simplemente enumera toda la interfaz implementada, sin preocuparse de filtrar los extendidos por otros. – Mau

3

Esa no es la forma en que realmente se codificó detrás de las escenas. Eso es exactamente lo que las herramientas como Reflector te muestran cuando convierte al IL nuevamente en C#.

+0

También lo puede ver en el visor de código. – Incognito

+0

@Incognito: codeviewer lo genera a partir de metadatos de la misma forma que lo hace el reflector. – EFraim

Cuestiones relacionadas