Muss ich Wörter nach der Konstruktor-Deklaration in die abgeleitete Klasse überladen oder überschreiben?

7

Ich habe eine Klassenhierarchie, diese:

%Vor%

Wie Sie sehen, haben sowohl die abgeleiteten als auch die Basisklassenkonstruktoren dieselbe Parameterliste. Ich rufe den Basisklassenkonstruktor explizit von abgeleitetem an:

%Vor%

Ist es notwendig, den Basisklassenkonstruktor in Delphi explizit aufzurufen? Vielleicht muss ich Overload oder Override setzen, um klar zu machen, was ich vorhabe? Ich weiß, wie man es in C ++ macht - Sie brauchen einen expliziten Aufruf eines Basisklassenkonstruktors nur, wenn Sie ihm einige Parameter übergeben wollen - aber ich habe nicht viel Erfahrung in der Delphi-Programmierung.

    
chester89 11.12.2008, 19:36
quelle

4 Antworten

14

Soweit ich weiß, gibt es zwei verschiedene Probleme:

Sicherstellen, dass der Konstruktor der Kindklasse den Konstruktor der Basisklasse

aufruft

Sie müssen explizit den Konstruktor der Basisklasse aufrufen:

%Vor%

Sicherstellen, dass der Konstruktor der Kindklasse den Konstruktor der Basisklasse überschreibt

Sie müssen auch den Konstruktor der untergeordneten Klasse override und den Konstruktor der Basisklasse virtual erstellen, um sicherzustellen, dass der Compiler die Beziehung zwischen den beiden sieht. Wenn Sie das nicht tun, warnt der Compiler Sie wahrscheinlich, dass der Konstruktor von TMinMatrix den TMatrix-Konstruktor "versteckt". Also wäre der korrekte Code:

%Vor%

Beachten Sie, dass Sie auch Ihren Destruktor override erstellen sollten.

Einführung eines Konstruktors mit anderen Parametern

Beachten Sie, dass Sie nur einen Konstruktor mit derselben Parameterliste überschreiben können. Wenn eine untergeordnete Klasse einen Konstruktor mit anderen Parametern benötigt und Sie verhindern möchten, dass die Konstruktoren der Basisklasse direkt aufgerufen werden, sollten Sie Folgendes schreiben:

%Vor%

Ich hoffe, das macht die Dinge klarer ... Viel Glück!

    
onnodb 11.12.2008, 20:04
quelle
3

Overload, teilt dem Compiler mit, dass eine Methode denselben Namen mit verschiedenen Parametern hat.

Überschreiben, teilt dem Compiler mit, dass eine Methode die in der Basisklasse deklarierte virtuelle oder dynamische Variable überschreibt.

Reintroduce, blendet die virtuelle oder dynamische Methode aus, die in der Basisklasse deklariert wurde.

Diese Definitionen stammen aus Ray Lischners Buch {Delphi in Kürze}

%Vor%

Der TSecond, wie er deklariert ist, ruft das Erstellen des TFirst auf, ohne dass er geerbt wird, die TSecond-Member bleiben leer.

    
CheGueVerra 11.12.2008 20:07
quelle
3

Sie müssen die geerbte Methode explizit aufrufen. Delphi wird es nicht für dich tun. Dies ist beabsichtigt, da es Fälle gibt, in denen Sie mit virtuellen Methoden arbeiten, z. B. wenn Sie das vererbte Verhalten nicht aufrufen möchten.

Außerdem schreibe ich den geerbten Anruf aus persönlichen Gründen gerne vollständig aus. ( geerbt Erstellen (Zeilen, Spalten); im Gegensatz zu nur geerbt; aus einem einfachen Grund: Es macht es so viel einfacher, den Code zu durchlaufen. Wenn Sie haben Wenn Sie einen Methodenaufruf ausgeschrieben haben, können Sie ihn durch Klicken steuern und die Ahnenmethode aufrufen.

    
Mason Wheeler 12.12.2008 18:42
quelle
2

Sie benötigen eine Überladung für beide Konstruktoren, wenn sie denselben Namen haben.

%Vor%

Es empfiehlt sich, den geerbten Konstruktor aufzurufen.

%Vor%     
Toon Krijthe 11.12.2008 20:02
quelle

Tags und Links