delphi-overload, override, virtual-Methode
haben einfach die Objekt-Hierarchie wie unten
TLiveThing=class
protected
FTest:string;
constructor Create(whereLive:string);overload;virtual;
constructor Create(haveBone:Boolean);overload;virtual;
end;
THuman=class(TLiveThing)
public
constructor Create(whereLive:string);overload;override;
constructor Create(age:integer);overload;
end;
in theoretisch, wenn ich zu instanziieren, THuman, ich habe 2 Konstruktor, aber in der Tat habe ich 5-Konstruktor angezeigt durch code insight, eigentlich will ich, um zu sehen, 3-Konstruktor,
- Erstellen(whereLive:String) überschrieben
- Erstellen(age:integer)
- Erstellen(haveBone:integer)
human:=THuman.Create( <=====in there I have 5 suggestion constructor
warum habe ich dieses merkwürdige Verhalten? wie es zu lösen ist, weil es so ärgerlich, ich kann nicht immer überprüfen, meine Klasse, die ich brauche, um zu instanziieren, und wenn ich zu instanziieren, wie unten
human:=THuman.Create(); <===== it doesnt give me error
wie ich komplett auszublenden mein anchestor-Konstruktor? , denn wenn ich instatiate wie oben, komplett, geben Sie mir einen falschen Objekt
UPDATE: und auch ich kann Sie sehen standardmäßig Erstellen, ohne parameter von TObject zu
- Sie haben zu viele virtuelle Konstruktoren. Sie müssen nur ein von denen.
- Sind Sie sicher, dass Sie die Notwendigkeit, jede virtuelle Konstruktoren? Haben Sie sich jemals tatsächlich zu instanziieren, jede dieser Klassen, ohne zu wissen, den Typ zur compile-Zeit? Wenn nicht, dann brauchen Sie nicht, virtuelle Konstruktoren.
- Es ist schwer, Sie zu empfehlen hier, weil wir nicht wissen, was dich antreibt, so viele überladene und virtuelle Konstruktoren. Auf den ersten Blick Ihre gesamte design riecht. Meine Instinkte sind, dass die Festsetzung der Bauweise wird die Probleme lösen. Sie versuchen sich zu verstecken von Konstruktoren ist ähnlich wie putting eine wäscheklammer auf die Nase. Das design immer noch riecht, kann man einfach nicht riechen es nicht mehr.
- oke, ich update meine Frage deutlich zu machen, mein Punkt, denn eigentlich ist in meinem code, die beide Konstrukteure haben ganz unterschiedliche parameter und irgendwann muss ich überschreiben, sowohl der Konstruktor von Basisklasse, und manchmal habe ich einfach Konstruktor von Basisklasse. Natürlich kann ich das umbenennen, einen anderen Konstruktor zu CreateByWhereLive oder etwas anderes anders umgehen mit diesem problem, und ich kann machen Sie es richtig funktioniert, aber wenn ich "Erstellen", ich kann nicht verstehen, warum das Verhalten so...
- Das update ändert nichts. Sie trifft nicht auf jeden der Punkte, Rob und ich aufgewachsen.
- in meinem Fall brauche ich ja alle, dass überlastung und virtuellen Konstruktor, ich code in C# auch, aber in c#, ich kann instanziieren Objekt ohne verwirren zu Standard-Konstruktor (parameterlosen Konstruktor), wenn meine Klasse hat keinen default-Konstruktor, mache ich es privat, dann kann ich nicht instanziiert, mit diesem Konstruktor...nur mal so zum Vergleich, so in delphi, ich Suche, wie zu verbergen Vorgänger-Konstruktor, wenn meine abgeleitete Objekt hat keinen Konstruktor, der
- möglich, Duplikat der so blenden Sie den geerbten Konstruktor von TObject, während die Klasse überlastet sind?
- Ich brauche alle, die überlastung und virtuellen Konstruktor. Ich bitte zu unterscheiden. Sie sollten nicht mehr als einen virtuellen Konstruktor. Wenn du tust, dein design ist falsch.
- mögliche Duplikate von Delphi: Wie ausblenden Vorfahren Konstruktoren?
- oke, ich verstehe, und verwenden Sie die Methode zum ausblenden der Standard-Konstruktor von TObject, aber ich will, 2 Konstruktor von Basisklasse, die überschrieben werden können oder nicht durch abgeleitetes Objekt, wenn die Klasse überschreiben, zwei Konstruktor von Basisklasse, also wenn ich instanziiere ich habe nur 2 Konstruktor, wenn die abgeleitete Klasse haben ein original-Konstruktor und einen Konstruktor überschrieben von der Basis-Klasse, die ich erwartet habe ich habe 3 Konstruktor, wenn ich das Objekt instanziieren, 1 aus der Basis-Klasse, 2 aus der abgeleiteten Klasse( original und überschriebenen Konstruktor ein), wie erreichen Sie das?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ohne dabei den Fokus auf Ihre schlechte Konstruktor-Implementierung,
dein problem ist, dass sowohl die Vorfahren und die untergeordnete Klasse definiert sind, in der gleichen Einheit, dafür die standard-definition von Private/Protected gilt hier nicht.
Wenn Sie verhindern möchten, dass der Vorgänger-Konstruktor (die überschreiben werden in der Kind-Klasse) von der Anzeige als code-parameter bei der Instanziierung ein Objekt der derrived Klasse dann einfach machen Sie es einem Mitglied des strengen geschützt oder strengen privaten Bereich.
Dein Beispiel :
Dies verhindert, dass der Vorfahr Konstruktor
Create(whereLive:string)
von der Anzeige als parameter beim erstellen eine Instanz der Kind-Klasse.Wie bereits von David, das hat nichts zu tun mit dem verstecken der Standard-Konstruktor Erstellen, es ist nur lebensfähig, für das verstecken Sie Ihre benutzerdefinierte Konstruktoren.
TObject.Create
wird sichtbar gemacht durch die Einführung einer überladenenCreate
. Siehe "duplizieren".