polimorfismo interfaces implementacion herencia form ejercicios ejemplos constructores clases clase abstracta c# interface base-class

herencia - implementacion de interfaces c#



¿Por qué se permite que una clase base en C#implemente un contrato de interfaz sin heredarlo? (2)

Me he topado con esta "característica" de C #: la clase base que implementa métodos de interfaz no tiene que derivarse de ella .

Ejemplo:

public interface IContract { void Func(); } // Note that Base does **not** derive from IContract public abstract class Base { public void Func() { Console.WriteLine("Base.Func"); } } // Note that Derived does *not* provide implementation for IContract public class Derived : Base, IContract { }

Lo que sucede es que Derived mágicamente toma un método público, Base.Func , y decide que implementará IContract.Func .

¿Cuál es la razón detrás de esta magia?

En mi humilde opinión: esta característica de "cuasi implementación" es muy poco intuitiva y hace que la inspección de códigos sea mucho más difícil. ¿Qué piensas?


¿Por qué crees que esto es extraño y antinatural? Cada miembro público de la clase base es también un miembro público de la clase derivada. Así que no hay contradicción aquí. De todos modos puedes implementar la interfaz explícitamente si lo deseas.


La razón es que tu comentario es simplemente incorrecto:

// Tenga en cuenta que Derived no proporciona implementación para IContract

Claro que sí. Sigue la lógica a través de.

  • Derivado es obligatorio para proporcionar un miembro público correspondiente a cada miembro de IContract.
  • Todos los miembros heredables de una clase base también son miembros de una clase derivada; Esa es la definición de herencia.
  • Por lo tanto, Derived proporciona una implementación para IContract; Su miembro heredado es un miembro que cumple con el requisito.
  • Por lo tanto, no hay error.

esta característica es muy poco intuitiva y hace que la inspección de códigos sea mucho más difícil. ¿Qué piensas?

Creo que no deberías usar la función si no te gusta. Si le resulta confuso y extraño leer el código que usa esta función, anime a sus compañeros de trabajo que usan esta función para que dejen de hacerlo.

¿En qué se diferencia esta característica de cualquier otra característica donde se usa un método de una clase base de una clase derivada? Hay una serie de formas diferentes en las que un método de una clase base se puede usar o mencionar en una clase derivada: llamadas a métodos, anulaciones, conversiones de grupos de métodos, etc.

Además, se trata relativamente de un caso simple y directo. Si realmente quiere quejarse de la confusa semántica de la interfaz en C #, pasaría mi tiempo quejándome sobre la semántica de la reimplementación de la interfaz . Ese es el que realmente parece hornear los fideos de la gente. Siempre tengo que buscar esa cosa en la especificación para asegurarme de que estoy entendiendo bien la semántica.