Ruft Delphi bei überschriebenen Prozeduren geerbt auf, wenn kein expliziter Aufruf vorliegt

7

Ruft Delphi bei überschriebenen Prozeduren geerbt auf, wenn es keinen expliziten Aufruf im Code gibt, dh (geerbt;), habe ich die folgende Struktur (von Super zu Subklasse)

TForm & gt; & gt; TBaseForm & gt; & gt; TAnyOtherForm

Alle Formulare im Projekt werden von TBaseForm abgeleitet, da diese über alle Standard-Setup- und Destruktiv-Teile verfügt, die für jedes Formular verwendet werden (Sicherheit, Validierung usw.).

TBaseForm hat onCreate- und onDestroy-Prozeduren mit dem Code, um dies zu tun, aber wenn jemand (dh ich) vergaß, geerbt zu OnCreate auf TAnyOtherForm hinzuzufügen, würde Delphi es für mich aufrufen? Ich habe Referenzen im Internet gefunden, die sagen, dass es nicht erforderlich ist, aber nirgends sagt, wenn es aufgerufen wird, wenn es aus dem Code weggelassen wird.

Auch wenn es für mich vererbt heißt, wann wird es es anrufen?

    
Re0sless 10.09.2008, 09:48
quelle

7 Antworten

17

Nein, wenn Sie den Anruf vererbt lassen, wird er nicht angerufen. Andernfalls wäre es nicht möglich, eine Methode zu überschreiben und die übergeordnete Version vollständig zu entfernen.

    
Ralph M. Rickenbach 10.09.2008, 09:53
quelle
3

Erwähnenswert ist, dass das Nichtaufrufen von Objekten in Destroy Speicherlecks verursachen kann. Es gibt Tools, um dies in Ihrem Quellcode zu überprüfen.

    
mj2008 10.09.2008 11:46
quelle
3

Der geerbte Aufruf muss explizit gemacht werden. Im Allgemeinen ruft keine Sprache automatisch die geerbte Funktion in äquivalenten Situationen auf (Klassenkonstruktoren sind nicht enthalten).

Es ist leicht zu vergessen, den geerbten Aufruf in einem Klassenkonstruktor zu machen. Wenn in einer solchen Situation eine Basisklasse Daten initialisieren muss, wartet eine Zugriffsverletzung.

Vielleicht könnten Sie DoCreate und DoDestory in Ihrer TBaseForm-Klasse überschreiben, damit Sie sicherstellen können, dass Code unabhängig von der Implementierung der untergeordneten Klassen ausgeführt wird.

%Vor%     
Frank 10.09.2008 11:13
quelle
2

Inherited muss explizit in den Nachkommenobjekten sowie in der Vererbung der visuellen Form aufgerufen werden. Wenn Sie die Klassenvervollständigung verwenden, wird automatisch eine Vererbung hinzugefügt, wenn Sie die Definition als Überschreibung gekennzeichnet haben (aber nicht zur erneuten Einführung). Wenn Sie die visuelle Formularvererbung verwenden, wird beim Hinzufügen eines neuen Ereignishandlers über den Formulareditor ebenfalls ein vererbtes hinzugefügt.

    
Jim McKeeth 12.09.2008 02:13
quelle
1

Der vererbte Code wird nicht implizit aufgerufen, wie die anderen angegeben haben. Sie müssen es explizit aufrufen. Dies gibt Ihnen einige nützliche Flexibilität. Zum Beispiel möchten Sie möglicherweise einen Vorverarbeitungscode vor dem geerbten Code erstellen und anschließend einen Nachbearbeitungscode eingeben. Das könnte so aussehen:

%Vor%     
Jody Dawkins 11.09.2008 20:18
quelle
0

Nein. Das ist der Sinn des Überschreibens.

    
JosephStyons 11.09.2008 20:21
quelle
0

Sie müssen es explizit aufrufen. Dies ermöglicht eine große Flexibilität, da Sie wählen können, an welcher Stelle im Code die geerbte Methode aufgerufen werden soll. Aber es ist auch eine große Quelle von Fehlern. Es ist leicht zu vergessen, die vererbte Funktion aufzurufen, und der Compiler hat keine Möglichkeit zu sagen, ob Sie es absichtlich getan haben oder Sie es einfach vergessen haben.

Es sollte eine Art Direktive "skip_inherited" geben, um dem Compiler mitzuteilen, dass Sie die geerbte Methode nicht aufrufen wollen.

Der Compiler würde dann leicht einen Fehler melden, wenn er "vererbt" oder "skip_inherited" nicht gefunden hat. Das würde bedeuten, dass du es vergessen hast. Aber leider hat niemand in CodeGear daran gedacht.

    
Old school 25.09.2013 15:30
quelle

Tags und Links