Warum sollte man nicht überschreibbare Methoden in Konstruktoren aufrufen?

9

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%     
Edward Ned Harvey 01.01.2014, 00:56
quelle

3 Antworten

5

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%     
Edward Ned Harvey 01.01.2014, 17:39
quelle
4

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.

    
T.S. 01.01.2014 02:23
quelle
0

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

    
Zinov 16.12.2016 15:57
quelle

Tags und Links