Basis innerhalb der Überschreibungsmethode aufrufen

Ich weiß, dass es Fragen zum Aufrufen der Basismethode innerhalb einer überschriebenen Methode gibt, z. B. das . Was aber, wenn eine überschriebene Methode nur die Basisklasse aufruft? Ist das schlecht / gut? Es scheint nur seltsam, warum eine Methode überschreiben, um die Basis trotzdem aufzurufen?

Siehe zum Beispiel:

public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } } 

Kommentare

  • Es hat keinen Zweck und überfrachtet nur den Code. Entfernen Sie ihn also.
  • @DavidArno that ' s was ich auch dachte, nur um sicherzugehen, dass es keinen ' Grund dafür gibt, bevor ich dies tat
  • In einer idealen Welt wird die App von abgedeckt Unit-Tests, so dass Sie es entfernen können, und wenn alle Tests noch bestanden sind, wissen Sie ', dass es nicht ' benötigt wird. Wir ' leben jedoch nicht immer in dieser idealen Welt, daher war es sinnvoll zu fragen 🙂
  • Der einzige Grund, warum ich ' Der Code würde wie oben aussehen, wenn in der Vergangenheit mehr Code in der überschriebenen Methode vorhanden wäre und dieser entfernt wurde, aber durch alte Versionen im Versionsverwaltungssystem angezeigt werden könnte. Wenn Sie ein Artefakt im aktuellen Code wie diesen belassen, kann dies dem Entwickler heute signalisieren, den Verlauf der Datei ' für die vorherige Version der Methode anzuzeigen.

Antwort

Aber was ist, wenn eine überschriebene Methode nur die Basisklasse aufruft? Ist das schlechtes / gutes Design?

Schlechtes Design ? Nein, eher schlechte Umsetzung. Für den Wartungsprogrammierer ist dies irreführend. Wenn ich keine Überschreibung sehe, weiß ich, dass die Basis aufgerufen wird. Ein Override sagt mir, dass es etwas anderes gibt, auch wenn dort auch die Basis aufgerufen wird.


Das Erfordernis einer Überschreibung zum Aufrufen der Basis ohne Vorlage ist schlechtes Design.

Referenzierter Thread – beliebteste Antwort

Meine erste Reaktion auf die skandinavische Überschreibung Modell ist: CODING HORROR! Es sieht so aus, als ob ich gezwungen bin, all das und noch mehr zu lesen, um sicherzustellen, dass das „Unterverhalten“ meinen Code nicht beschädigt und umgekehrt.

Die Template Method Pattern ist eine gute Möglichkeit, variablen Code in einem größeren Codefluss auszudrücken und die korrekte Ausführungsreihenfolge sicherzustellen.

Nach meiner Erfahrung ist es so typisch für eine Unterklasse, dies wissen zu müssen welche von der Basis deklarierten Methoden aufgerufen werden sollen und in welcher Reihenfolge. Nehmen Sie eine Menge Unterklassen mit derselben Kontrollstruktur zum Ausschneiden und Einfügen und fügen Sie 5 Jahre Wartung hinzu. Jetzt verstehst du, warum ich 101 Beweise bevorzuge Wilde Türkei .

P.S. All dies ist ein wichtiger Grund, warum ich gegen die Überbeanspruchung von interface s anstelle von abstract -Klassen schimpfe.

Kommentare

  • Die übermäßige Verwendung von Schnittstellen in C # ist höchstwahrscheinlich darauf zurückzuführen, dass der Implementierer nicht an diese bestimmte abstrakte Basisklasse gefesselt werden möchte. Durch die Verwendung einer Schnittstelle kann der Implementierer eine andere Basisklasse implementieren und nicht nur diese spezifische abstrakte Klasse. Es hängt jedoch sehr von den Umständen ab. Ich finde, eine gute Praxis ist es, sowohl eine IFoo -Schnittstelle als auch eine FooBase -Klasse zu haben, die die IFoo -Schnittstelle mit abstrakten Methodenaufrufen für die Methoden und Auto-Eigenschaften für die Requisiten. Vielleicht werfen Sie auch einen Ctor ein.

Antwort

IMO, virtual -Methoden in der Basisklasse haben eine sehr grundlegende Implementierung. Selbst wenn wir override die Definition der Methode virtual in der untergeordneten Klasse verwenden, können wir die virtual -Methode (mit grundlegender Implementierung), obwohl dies sinnvoll ist und das beabsichtigte Verhalten der overridden -Methode in der untergeordneten Klasse nicht beeinflusst.

Zum Beispiel BaseCalculator macht die eigentliche Arbeit. Der Rechner dekoriert die BaseCalculator-Bibliothek, indem er sie erweitert.

public class BaseCalculator { public virtual T Add<T>(T number01, T number02) { return number01 + number02; } } public class Calculator: BaseCalculator { public override T Add<T>(T number01, T number02) { Console.WriteLine(number01 + " | " + number02); var result = base.Add<int>(1, 3); Console.WriteLine("Result: "+ result); return result; } } 

F: Was passiert, wenn eine überschriebene Methode nur die Basisklasse aufruft?

A: In Ihrem Fall mit der Basisklassenmethode virtual, wir müssen es nicht override, bis wir sein Verhalten ändern möchten.

F: Ist das schlecht / gut?

A: Ja, das Design könnte schlecht sein, da die Quellcodedatei unübersichtlich wird, während unnötige Überschreibungen hinzugefügt werden.

F: Es scheint nur seltsam, warum eine Methode überschreiben, um die Basis trotzdem aufzurufen?

A: BaseCalculator erledigt die eigentliche Arbeit . Der Rechner dekoriert die BaseCalculator-Bibliothek, indem er sie erweitert.

Hoffe, es hilft!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.