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 #?
?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.
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.
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:
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.
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.
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.
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.
Tags und Links c#