Me he tropezado con esta "característica" de C# - la clase base que implementa métodos de interfaz no tiene que derivar de ella.¿Por qué una clase base en C# permite implementar un contrato de interfaz sin heredar de él?
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 pasa es que Derived
recoge-mágicamente un método público, Base.Func
, y decide que pondrá en práctica IContract.Func
.
¿Cuál es el motivo de esta magia?
En mi humilde opinión: esta característica de "casi implementación" es muy poco intuitiva y hace que la inspección del código sea mucho más difícil. ¿Qué piensas?
Creo que puede evitar el efecto secundario con la implementación explícita de la interfaz en la clase derivada. – kenny
Esto tiene sentido para mí. Cuando Derived hereda IContract, lo que eso significa es que proporciona Func(), que lo hace. Que lo haga a través de la herencia es meramente incidental. Tenga en cuenta que Base * no * implementa IContract: si intentaba convertir una Base en IContract, fallaría. – allonym