Ich bin über dieses "Feature" von C# - die Basisklasse gestolpert, die Schnittstellenmethoden implementiert, muss nicht davon abgeleitet werden.Warum darf eine Basisklasse in C# einen Schnittstellenvertrag implementieren, ohne von ihm zu erben?
Beispiel:
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
{
}
Was passiert, ist, dass Derived
magisch zieht an eine öffentliche Methode, Base.Func
und entscheidet, dass es IContract.Func
umsetzt.
Was ist der Grund für diese Magie?
IMHO: diese "Quasi-Implementierung" -Funktion ist sehr unintuitiv und machen Code-Inspektion viel schwieriger. Was denken Sie?
Ich 'denke', dass Sie mit der expliziten Implementierung der Schnittstelle in abgeleiteten Klasse den Nebeneffekt umgehen können. – kenny
Das macht für mich Sinn. Wenn Derived IContract erbt, bedeutet das, dass es Func() bereitstellt, was es tut. Dass es durch Vererbung geschieht, ist nur nebensächlich. Beachten Sie, dass Base * nicht * IContract implementiert - wenn Sie versuchen würden, eine Base nach IContract zu konvertieren, würde dies fehlschlagen. – allonym