Frage

Hat Delphi call geerbt, überschrieben auf Verfahren, wenn kein expliziter Aufruf im code ie (geerbt;), habe ich die folgende Struktur (aus super-sub-Klasse)

TForm >> TBaseForm >> TAnyOtherForm

Alle Formen, die in das Projekt, davon abgeleitet wird von TBaseForm, da diese über alle standard-set-up und destruktiven Teile, dass sind verwendet für jede form (Sicherheit, Validierung, ect).

TBaseForm hat onCreate-und onDestroy-Verfahren mit dem code zu tun, aber wenn jemand (also ich) vergaß hinzuzufügen, geerbt, der onCreate auf TAnyOtherForm würde, Delphi nenne es für mich?Ich habe festgestellt Verweise auf die web, die sagen, es ist nicht erforderlich, aber nirgends sagt, wenn es aufgerufen wird, wenn es weggelassen wird aus dem code.

Auch wenn es nicht nennen geerbt, für mich, Wann werden Sie es nennen?

War es hilfreich?

Lösung

Nein, wenn Sie den Anruf geerbt weg verlassen, wird es nicht aufgerufen werden. Sonst wäre es nicht möglich sein, eine Methode zu überschreiben und völlig ommit die übergeordnete Version davon.

Andere Tipps

Es ist erwähnenswert, dass nicht Aufruf Zerstören eines Objekts in geerbt können Speicherverluste verursachen. Es gibt Tools für diese im Quellcode zu überprüfen.

Der geerbt Anruf hat explizit gemacht werden. In der Regel automatisch keine Sprache ruft die geerbte Funktion in äquivalenten Situationen (Klassenkonstruktoren nicht enthalten).

Es ist leicht zu vergessen, den geerbte Anruf in einer Klasse Konstruktor zu machen. In einer solchen Situation muss, wenn eine Basisklasse alle Daten, die Sie eine Zugriffsverletzung passieren warten müssen initialisiert werden.

Vielleicht könnten Sie DoCreate und DoDestory in Ihrer TBaseForm Klasse überschreiben, so dass Sie einige Code ausgeführt wird, unabhängig von der Umsetzung der Kinderklassen gewährleisten könnten.

// interface

TBaseForm = Class(TForm)
...
Protected
    Procedure DoCreate(Sender : TObject); Override;
End

// implementation

Procedure TBaseForm.DoCreate(Sender : TObject);
Begin
    // do work here

    // let parent call the OnCreate property  
    Inherited DoCreate(Sender);
End;

geerbt muss explizit in Nachkommen Objekte als auch in visueller Form Vererbung bezeichnet werden. Wenn Sie die Klassenvervollständigung verwenden dann fügt sie geerbt automatisch, wenn Sie die Definition als Überschreibung (aber nicht für reintroduce) Liste steht. Wenn Sie dann visuelle Form Vererbung verwenden, wenn Sie ein neues Ereignis Hander durch den Formular-Editor hinzufügen, dann wird es auch geerbt hinzuzufügen.

Der geerbte Code wird nicht implizit aufgerufen, wie die anderen angedeutet haben. Sie müssen es explizit aufrufen. Dies gibt Ihnen einige nützliche Flexibilität. Zum Beispiel mögen Sie vielleicht einigen vorbereitenden Code vor dem geerbten Code tun, dann später etwas Nachbearbeitung Code tun. Dies könnte wie folgt aussehen:

procedure TMyCalcObject.SolveForX;
begin
  ResetCalcState;
  inherited SolveForX;
  PostProcessSolveForX;
end;

Nein. Das ist der ganze Sinn der überwiegenden.

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

Es sollte eine Art Richtlinie sein „skip_inherited“ Compiler zu sagen, dass Sie nicht wollen, die geerbte Methode aufrufen.

Compiler würde dann leicht Fehler melden, wenn es auch nicht „vererbt“ oder „skip_inherited“ das finden. Das würde bedeuten, Sie vergessen haben. Aber leider niemand in CodeGear dachte das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top