Mehrfache Vererbung mit der abstrakten Klasse und der Schnittstelle

9

Ich habe den folgenden Code in C # .NET geschrieben.

%Vor%

Beim Kompilieren habe ich keinen Fehler bekommen. Compiler zwingt mich nicht, die Methode "func ()" zu implementieren; in "MyClass", die von der Schnittstelle "IWork" .Latter abgeleitet wurde, kann ich eine Instanz der Klasse "MyClass" erstellen und die Funktion "func ()" aufrufen. Warum zwingt mich der Compiler nicht zur Implementierung der Methode "func ()" in der "MyClass" (die von "IWork" Schnittstelle abgeleitet wurde? Ist es ein Fehler in C #?

?     
techmad 06.07.2012, 08:53
quelle

7 Antworten

5

Um das Konzept hinter den Schnittstellen besser zu verstehen, gebe ich Ihnen nur den richtigen Code für Ihre Implementierung:

%Vor%

Die Grundregel: Sie müssen die Schnittstelle immer dort einfügen, wo die Implementierung ist. Wenn Sie also eine Methode innerhalb einer abstrakten Klasse erstellen und eine Schnittstelle dieser Methode definieren, müssen Sie die Schnittstelle in Ihre abstrakte Klasse implementieren, und dann implementieren alle Unterklassen diese Schnittstelle automatisch.

Tatsächlich haben Schnittstellen zwei Arten von Funktionen, für die Sie sie verwenden können:

1) Als "echte" Schnittstelle, die eine generische Behandlung jeder Klasse ermöglicht, die die Schnittstelle implementiert, so dass Sie mehrere Arten von Klassen nur über eine Schnittstelle handhaben können (ohne ihre wirklichen Klassennamen zu kennen). "Handhabung" bedeutet: Aufruf einer Methode.

2) Als Hilfe für andere (Framework-) Programmierer, damit Sie Ihren Code nicht durcheinander bringen. Wenn Sie sichergehen möchten, dass eine Methode nicht durch einen anderen Namen ersetzt wird, definieren Sie eine Schnittstelle für Ihre Klasse, die alle Methodennamen enthält, die Sie unbedingt haben müssen. Selbst wenn die Methode nirgendwohin aufgerufen wird, erhält der Programmierer eine Kompilierfehlermeldung, wenn er den Methodennamen ändert.

Jetzt können Sie Ihre Myclass einfach mit der Schnittstelle IWork verwalten.

    
Marcus 22.02.2013 20:56
quelle
4

Als ich über dieses Thema las, stellte ich fest, dass ich es nicht einfach in meinem Kopf zusammenfassen konnte, also schrieb ich das folgende Stück Code, das als Spickzettel für die Funktionsweise von C # dient. Hoffe es hilft jemandem.

%Vor%

Gibt die folgende Ausgabe aus:

FunktionA () in der abstrakten Klasse implementiert. Kann in der konkreten Klasse nicht überschrieben werden.

FunctionB () in der abstrakten Klasse implementiert. Kann in konkrete Klasse überschrieben werden.

FunctionB () in der abstrakten Klasse implementiert, aber optional in der konkreten Klasse überschrieben.

FunctionC () muss in der konkreten Klasse implementiert werden, da die abstrakte Klasse keine Implementierung bereitstellt.

    
Patrick 13.05.2016 10:55
quelle
3

Weil die Klasse abstract die Schnittstelle implementiert.

Wenn Ihre Klasse MyClass nicht von WorkClass erbt, erhalten Sie die Fehlermeldung 'MyClass' does not implement interface member 'IWork.func()' .

Aber Sie erben auch von WorkClass , das tatsächlich die Methoden implementiert, die die Schnittstelle benötigt.

Sie können func() als abstrakt markieren, wenn Sie die Klassen erzwingen wollen, die es erben, um es wie folgt zu implementieren:

%Vor%     
Filip Ekberg 06.07.2012 08:54
quelle
1

Ich habe versucht mit den Klassen oben in meiner Lösung. Es erbt die abstrakte Klasse, so dass die abgeleitete Klasse die func () -Methodendefinition hat. Dies ist der Grund, warum kompilierte Fehler nicht angezeigt werden konnten.

    
quelle
0

func() ist nicht als abstract in WorkClass markiert, sodass Sie es nicht in Klassen implementieren müssen, die von WorkClass abgeleitet sind.

WorkClass implementiert das Interface IWork , so dass Sie es nicht in MyClass implementieren müssen, weil es func() von WorkClass erbt.

    
DaveShaw 06.07.2012 08:56
quelle
0

Da die Methode func in der abstrakten Klasse eine nicht-virtuelle Methode ist, hält der Compiler diese Methode für eine Implementierung der Schnittstelle.

    
Blindsniper 06.07.2012 08:56
quelle
0

Wenn Sie MyClass auf WorkClass erweitern, wird die Methode func() (die definiert wurde) vererbt.

Wenn also die Schnittstelle IWork implementiert ist, wurde die Methode 'func ()' bereits definiert. Also gibt es keine undefinierten Methoden in MyClass .

Die Klasse MyClass ist also eine konkrete Klasse, aufgrund derer Sie ein MyClass -Objekt ohne Kompilierungsfehler erstellen können.

    
Vizard 06.07.2012 09:02
quelle

Tags und Links