Dies ist ein vereinfachtes Beispiel, aber ich habe einen Code aus dem wirklichen Leben, der konzeptionell das Gleiche tut (versucht, Werte zu validieren, "setze" Zugriffsmethoden von abgeleiteten Klassen), und der Analyzer gibt mir "Überschreibbare Methoden nicht aufrufen Konstrukteure. " Ich versuche herauszufinden, ob ich meinen Code ändern oder die Warnung ignorieren sollte. Ich kann mir keinen Grund vorstellen, warum ich die Warnung beachten sollte.
%Vor%als T.S. sagte (Danke T. S.), der Basiskonstruktor wird immer aufgerufen, wenn der abgeleitete Typ instanziiert wird. Wenn Sie wie in der Frage vorgehen, wo der Derivatkonstruktor nicht ausdrücklich angibt, welchen Basiskonstruktor er verwenden soll, wird der parameterlose Basiskonstruktor verwendet.
%Vor%Und
%Vor%Die vollständige Antwort auf diese Frage lautet also: Die in der Basisklasse deklarierten abstrakten oder virtuellen Methoden sind in der Basisklasse nur überschreibbar , wenn Sie die derivative Klasse versiegelt haben . Um also sauberen Code zu erstellen, führen Sie diese Zeile nicht im Basiskonstruktor aus:
%Vor%Sie sollten stattdessen die derivative Klasse (oder Methode) "versiegeln". Wie folgt:
%Vor%Alternativ müssen Sie nicht die gesamte derivative Klasse versiegeln, wenn Sie nur die überschreibbare Methode versiegeln (die nicht mehr durch andere derivative Klassen überschrieben werden kann)
%Vor%Die Antwort ist wirklich, das kann zu unerwartetem Verhalten führen.
Etwas, das Sie in Ihrem Code verpasst haben:
%Vor%Siehst du jetzt? Sie können NICHT einen Konstruktor haben, den Ihre Basis freilegt. Und dann wird base seinen Konstruktor ausführen, bevor Sie Ihr virtuelles Mitglied setzen.
Ich möchte hinzufügen, dass das Aufrufen und Überschreiben der Methode im Konstruktor zu einem inkonsistenten Zustand des Programms führen kann. Was passiert, wenn Ihre Methode eine Ausnahme auslöst? Dann wird dein Objekt niemals konstruiert werden. Und es ist keine gute Übung, diese Ausnahmen im Konstruktor abzufangen.
%Vor%Eine Lektion, die Sie aus Windows Form lernen können, ist, dass der Designer eine InitializeComponents hat, die vom Konstruktor aufgerufen wird.
%Vor%InitializeComponent wird vom Designer generiert. Modifizieren Sie es nicht weil Änderungen verloren gehen, wenn die Designereigenschaften geändert werden. Der Zweck von InitializeComponent besteht einzig und allein für den Designer, alle zu setzen sein Code, um alle Eigenschaften einzustellen, und irgendwo, wo er gelesen werden soll Zeichnen der Designeroberfläche, um das Relevante zu rendern Komponenteneinstellungen
Was wäre, wenn InitializeComponent eine Überschreibungsmethode wäre? Dann könnten Sie es ändern, und am Ende könnte das gesamte Formular in einem inkonsistenten Zustand sein, wenn Ihre Änderungen falsch sind und die Logik der Basisklasse durchbrechen
Tags und Links c# constructor methods override