2008-09-10 16 views
7

Wird Delphi-Aufruf bei überschriebenen Prozeduren geerbt, wenn kein expliziter Aufruf im Code vorhanden ist (geerbt;), habe ich die folgende Struktur (von Super- zu Subklasse)Wird Delphi-Aufruf bei überschriebenen Prozeduren geerbt, wenn kein expliziter Aufruf erfolgt

TForm >> TBaseForm >> TAnyOtherForm

alle Formulare in dem Projekt wird von TBaseForm abgeleitet werden, da dies alle Standard-set-up und destruktive Teile haben, die für jede Form (Sicherheit verwendet werden, Validierung ect).

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

Auch wenn es Anruf geerbt für mich, wann wird es anrufen?

Antwort

17

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

3

Der vererbte 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 von untergeordneten Klassen ausgeführt wird.

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.

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. Dies könnte wie folgt aussehen:

procedure TMyCalcObject.SolveForX; 
begin 
    ResetCalcState; 
    inherited SolveForX; 
    PostProcessSolveForX; 
end; 
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 eine visuelle Formularvererbung verwenden, wird beim Hinzufügen eines neuen Ereignishandlers über den Formulareditor ebenfalls ein geerbtes Formular hinzugefügt.

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.

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