Mein Testcode in C #:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Führt zu folgendem 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 für konkrete Klassen obligatorisch sein ?
c#
syntax
interface
abstract-class
bguiz
quelle
quelle
Antworten:
In C # ist eine Klasse erforderlich , die eine Schnittstelle implementiert , um alle Mitglieder dieser Schnittstelle zu definieren. Bei einer abstrakten Klasse definieren Sie diese Mitglieder einfach mit dem
abstract
Schlüsselwort:Oder anders ausgedrückt: Sie nicht müssen „implementieren“ es (das ist eine schreckliche Beschränkung auf abstrakte Klassen wäre); In C # müssen Sie dem Compiler jedoch mitteilen, dass Sie das Geld absichtlich an konkrete Unterklassen übergeben - und die obige Codezeile zeigt, wie das geht.
Die Kommentare und Abstimmungen, die sich darüber beschweren, dass dies keine Antwort auf die Frage ist, verfehlen den Punkt. Jemand, der zu Stack Overflow kommt, 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 - müsste Implementierungsmethoden schreiben, die Laufzeitausnahmen auslösen, eine schreckliche Arbeit -umound - bis sie die oben genannten Informationen haben. Ob es gut oder schlecht ist, dass C # diese Aussage erfordert, liegt außerhalb des Bereichs des Stapelüberlaufs und ist weder für die Frage noch für diese Antwort relevant.
quelle
Foo
anpublic abstract void IFoo.Bar();
und Sie bekommen Beschwerden , dass „öffentlich“ und „abstrakt“ sind keine gültigen Modifikatoren.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
quelle
Sie müssen die Schnittstelle nicht tatsächlich implementieren .
Die Schnittstellenmethoden / -eigenschaften können abstrakt oder auch virtuell sein. Es liegt also an den Unterklassen, sie tatsächlich zu implementieren.
quelle