2008-11-01 11 views
6

veo cosas como esta mucho:Vuelva a implementar una interfaz que otra interfaz ya se hereda

interface A { ... } 
interface B : A { ... } 
class C : B, A { ...} 

¿Por qué C especificar que implementa la interfaz A, B, cuando ya se hereda A? ¿Tiene alguna diferencia semántica o es solo una cuestión de estilo?

(Uno de los muchos ejemplos es List<T> implementar IList<T> y ICollection<T>, mientras IList<T> deriva también de ICollection<T>).


Actualización: Gracias por confirmar mi suposición de que no hay ninguna diferencia semántica.

que han llegado con una situación relacionada donde qué hacer una diferencia para nombrar explícitamente una interfaz que ya está en el árbol de herencia:

Si B eran una clase, C haría solamente (re) implementar miembros de interfaz desde A si nombra A explícitamente después del ':'.

[EDITAR] Cambié la redacción de la pregunta para evitar confusiones con los miembros de la interfaz implementados explícitamente, que restringen el uso del miembro a los casos en que el objeto se convierte como la interfaz.

Respuesta

11

Creo que esto es solo una cuestión de estilo. Es especialmente importante cuando se analizan las clases de framework/library: en su ejemplo, por ejemplo, resalta la idea de que esta clase puede tratarse como ICollection o IList, sin que el desarrollador tenga que saber que IList es realmente una ICollection.

No tiene ramificaciones funcionales. En concreto, este código se compilará si o no de clase 'A' implementos 'C' de forma explícita:

namespace DotNetInterfaceTest { 
    class Program { 
     static void Main(string[] args) { 
      A c = new C(); 
     } 
    } 

    interface A { 
     void foo(); 
    } 

    interface B : A { 
     void bar(); 
    } 

    class C : B { 
     public void bar() {} 
     public void foo() {} 
    } 
} 
+0

Creo que es para una mejor legibilidad .. sin tener que trabajar las células del cerebro que atraviesan la jerarquía de herencia de interfaz. – Gishu

Cuestiones relacionadas