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.
Soweit ich weiß, gibt es zwei verschiedene Probleme:
Sie müssen explizit den Konstruktor der Basisklasse aufrufen:
%Vor% 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:
Beachten Sie, dass Sie auch Ihren Destruktor override
erstellen sollten.
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!
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.
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.
Sie benötigen eine Überladung für beide Konstruktoren, wenn sie denselben Namen haben.
%Vor%Es empfiehlt sich, den geerbten Konstruktor aufzurufen.
%Vor%Tags und Links delphi inheritance constructor