it-swarm.com.de

Abstrakte Klassen müssen Schnittstellen implementieren?

Mein Testcode in C #:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

Ergibt folgenden Compilerfehler:

error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'

Da die Klasse Test eine abstrakte Klasse ist, warum benötigt der Compiler sie, um die Schnittstelle zu implementieren? Sollte diese Anforderung nicht nur obligatorisch für konkrete Klassen sein?

123
bguiz

In C # ist eine Klasse, die eine Schnittstelle implementiert, erforderlich, um alle Mitglieder dieser Schnittstelle zu definieren. Im Fall einer abstrakten Klasse definieren Sie diese Elemente einfach mit dem Schlüsselwort abstract:

interface IFoo
{
    void Bar();
}

abstract class Foo : IFoo
{
    public abstract void Bar();
}

Oder anders ausgedrückt: Sie müssen nicht "implementieren" es (was eine schreckliche Einschränkung für abstrakte Klassen wäre); In C # müssen Sie jedoch dem Compiler mitteilen, dass Sie den Buck absichtlich an konkrete Unterklassen übergeben - und die obige Codezeile zeigt, wie das geht tun Sie dies.

Den Kommentaren und Abwertungen, mit denen beanstandet wird, dass dies keine Antwort auf die Frage ist, fehlt der Sinn. Jemand, der zu Stack Overflow kommt, der diesen Compilerfehler erhalten hat, aber eine abstrakte Klasse hat, in der es ein Fehler wäre, eine Implementierung bereitzustellen, steckt ohne eine gute Lösung fest - er müsste Implementierungsmethoden schreiben, die Laufzeitausnahmen auslösen, eine horrende Arbeit -around - bis sie die oben genannten Informationen haben. Ob es gut oder schlecht ist, dass C # diese explizite Aussage erfordert, liegt außerhalb des Bereichs von Stack Overflow und ist weder für die Frage noch für diese Antwort relevant.

129
Joel

Im Gegensatz zu Java muss in C #: "eine abstrakte Klasse Implementierungen aller Mitglieder der Schnittstellen bereitstellen, die in der Basisklassenliste der Klasse aufgeführt sind. Eine abstrakte Klasse darf jedoch Schnittstellenmethoden abstrakten Methoden zuordnen."

https://msdn.Microsoft.com/en-us/library/Aa664595 (v = VS.71) .aspx

10
00jt

Sie müssen die Schnittstelle nicht wirklich implementieren.
Die Schnittstellenmethoden/-eigenschaften können abstrakt oder auch virtuell sein. Es liegt also an den Unterklassen, sie tatsächlich zu implementieren.

4
ntziolis