2016-08-19 2 views
5

SITUATIONDelphi erben Erstellen von TObject

Diese Frage sehr einfach sein kann, aber ich bin neu in Delphi und ich bin es jetzt studieren. Um Klassen besser zu verstehen, habe ich eine entwickelt, die die Lösungen von Gleichungen zweiten Grades berechnet. Dies ist der Code:

type 
TArrayOfStrings = array of string; 

type 
TEqSecGrado = class(TObject) sealed 
    private 
    a, b, c: double; 
    delta: double; 
    solutions: TArrayOfStrings; 
    function getDelta(vala, valb, valc: double): double; overload; 
    public 
    constructor Create(a, b, c: double); 
    function getDelta: double; overload; 
    function getSolutions: TArrayOfStrings; virtual; 
end; 

Das ist ziemlich in der Tat einfach, aber ich würde auf den constructor konzentrieren möge.


FRAGE

Aus dem Buch, dass ich weiß, ich lese meine Klasse (auch wenn die (TObject) ist nicht erforderlich) eigentlich eine Unterklasse von TObject ist. Aus diesem Grund kann ich den Konstruktor Create standardmäßig ohne Parameter aufrufen. Meine Frage ist:

Muss ich die inherited anrufen? Ich habe untersucht, dass ich mit dem oben genannten Schlüsselwort das Verhalten des Konstruktors Create in TObject in meiner Klasse "kopiere". Ich muss das Objekt sicher erstellen, aber dann muss ich auch Standardwerte für meine Parameter festlegen.

Da es nicht sehr gut erklärt ist, habe ich nicht verstanden, wenn ich inherited verwenden muss. Soll ich es in diesem Fall tun?

+2

Mögliche Duplizierung: Werfen Sie einen Blick auf http://StackOverflow.com/Questions/772336/using-inherited-in-the-Create-Constructor-of-an-Tobject –

+0

Ich habe einen Fehler, wenn ich die geerbt in mein Erstellen. Ich würde gerne sehen, was andere vorschlagen müssen –

+2

'geerbt;' in einem Konstruktor mit Parametern versucht, den gleichen Konstruktor mit den gleichen Parametern der Oberklasse aufzurufen. Das gibt es nicht, also bekommst du einen Fehler. Versuchen Sie stattdessen 'geerbt Create; '. Nun macht 'TObject.Create' nichts, aber wenn Sie eines Tages entscheiden, von einer anderen Klasse zu erben, ist es immer noch gültig. –

Antwort

16

Vererbt wird nicht unbedingt benötigt, wenn Sie wissen, dass der Elternteil TObject ist. (Wenn Sie den Konstruktor von TObject betrachten, ist dieser leer). Es ist jedoch eine schlechte Übung, den vererbten Konstrukteur aus mehreren Gründen, die ich in Kürze skizzieren werde, nicht zu nennen. Aber zuerst, wie man nennen die geerbte Konstruktor wie dies

constructor TEqSecGrado.Create(a, b, c: double); 
begin 
inherited Create; // Note that we need to explicitly name create here because it does not hae the same parameters as our create 
Self.a := a; 
Self.b := b; 
Self.c := c; 
delta := 0; 
end; 

Aber wenn der geerbten Konstruktor leer ist, warum sollten wir müssen es nennen?

Es hat alles mit Wartung zu tun, und was sechs Monate später passiert, wenn wir vergessen haben, was wir getan haben und warum.

Erstens kann es sein, dass wir uns entscheiden, etwas anderes als TObject zu refaktorieren und zu erben. Wenn wir den geerbten Konstruktor jetzt eingeschlossen haben, wird er entweder später noch gültig sein, oder der Compiler wird uns sagen, dass wir etwas tun müssen.

Zweitens kontrollieren wir TObject nicht, die Delphi-Compiler-Autoren tun. Es kann sein, dass TObject.Create in Zukunft nicht leer ist. Stellen Sie sich vor, Sie müssen alle unsere Konstruktoren durchgehen, um die geerbte Version hinzuzufügen! Natürlich würde es einen Aufschrei von all jenen Programmierern geben, die es für Zeitverschwendung hielten, also wird es niemals passieren. Wahrscheinlich.

+1

Das war genau das, wonach ich suchte, ich werde das Create immer als eine gute Praxis erben. Danke :) –

+1

@AlbertoRossi Ja, das ist eine gute Übung, aber es ist nicht notwendig, dass die Klasse, von der Sie erben, einen Konstruktor namens Create hat. Wenn Sie andere Klassen erben, erwartet der übergeordnete Konstruktor möglicherweise auch bestimmte Parameter, die an seinen Konstruktor übergeben werden. Falls Ihr Konstruktor dieselbe Struktur hat, die 'geerbt; aufruft; würde diese Parameter auch übergeben, aber wenn nicht, müssen Sie' geerbten ParentConstructorName '( – SilverWarior

+0

) aufrufen. Tatsächlich könnte ich 'Konstruktor CreateMyObject;' setzen und niemals die tatsächliche 'Create' - aber innerhalb' CreateMyObject' Aufruf 'geerbt Create; '. –

Verwandte Themen