Pregunta

Veo cosas como esta mucho:

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

¿Por qué especificarías que C implementa la interfaz A, cuando B ya hereda A?¿Hace alguna diferencia semántica o es sólo una cuestión de estilo?

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


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

Se me ocurrió una situación relacionada en la que hace Haga una diferencia nombrar explícitamente una interfaz que ya está en el árbol de herencia:

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

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

¿Fue útil?

Solución

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

No tiene ramificaciones funcionales. Específicamente, este código compilaría si la clase 'C' implementa 'A' explícitamente:

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() {}
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top