Delphi: Wie verstecke ich Ahnenkonstruktoren?

Aktualisieren hat die Frage mit einem einfacheren Beispiel ausgeweidet, das von der ursprünglich akzeptierten Antwort nicht beantwortet wird

Gab die folgende Klasse und ihren Vorfahren:

TComputer = class(TObject)
public
   constructor Create(Teapot: string='');
end;

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;

Jetzt sofortTCellPhone hat 3 sichtbare Konstruktoren:

Cup: IntegerCup: Integer; Teekanne: string Teekanne: string = ''

Was mache ich mitTCellPhone damit der Ahnenkonstruktor Teapot: string = '') ist nicht sichtbar, es bleiben nur die deklarierten Konstruktoren:

Cup: IntegerCup: Integer; Teekanne: string

Hinwei: Normalerweise der einfache Akt von mit ein Konstruktor eines Nachkommen verbirgt den Vorfahren:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); virtual;
end;
Cup: Integer

Und wenn Du wollte Um sowohl den Konstruktor des Vorfahren als auch den Nachkommen beizubehalten, markieren Sie den Nachkommen als overload:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
end;
Cup: Integer Teekanne: string = ''

Im Beispielcode dieser Frage verwechselt Delphi meinoverload Schlüsselwörter

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;

zu denken, dass

Ich möchte meine Konstruktoren mit dem @ überladVorfah,wenn ich es wirklich mit dem @ überladen wiGeschwiste

Wie verstecke ich den Ahnenkonstruktor?

Hinweis Es ist möglicherweise unmöglich, den nicht virtuellen Konstruktor des Vorfahren in der aktuell definierten Delphi-Sprache auszublenden."Nicht möglich" ist eine gültige Antwort.

Attempted Answer (fehlgeschlagen)

i versucht Markieren Sie die untergeordneten Konstruktoren mitreintroduce (Zurückgreifen auf meinen Modus zum zufälligen Hinzufügen von Keywords, bis es funktioniert):

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); reintroduce; overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;

Aber das hat nicht funktioniert, alle drei Konstruktoren sind noch sichtbar. :

Original Question

Ich habe ein Objekt, das von einer Klasse abstammt, deren Konstruktoren es nicht sehen wollen:

TEniac = class(TObject)
   constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create

TComputer = class(TEniac) ...
   constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create(nil)

TCellPhone = class(TComputer)
   constructor Create(sim: TSimChip; UnlockCode: Integer); //calls inherited Create(nil)

TiPhone = class(TCellPhone)
   constructor Create(sim: TSimChip); //calls inherited Create(sim, 0)

Hinweis Dies ist ein hypothetisches Beispiel. Wie in der realen Welt können die Vorgängerobjekte nicht geändert werden, ohne den vorhandenen Code zu beschädigen.

Jetzt wenn jemand @ benutTiPhone Ich möchte nicht, dass sie in der Lage sind,sehe der Konstruktor vonTEniac:

iphone := TiPhone.Create(powerCord);

Schlimmer noch: Wenn sie diesen Konstruktor aufrufen, vermissen sie meinen Konstruktor und alles, was dazwischen gemacht wurde. Es ist ziemlich einfach, den falschen Konstruktor aufzurufen, alle sind in der IDE-Code-Vervollständigung sichtbar und werden kompiliert:

TiPhone.Create;

und sie bekommen ein völlig ungültiges Objekt.

ich könnte @ ändeTCellPhone, um eine Ausnahme in diesen Konstruktoren auszulösen:

TCellPhone.Create(PowerCord: TPowercord)
begin
   raise Exception.Create('Don''t use.');
end;

Aber Entwickler werden nicht bemerken, dass sie den falschen Konstruktor aufrufen, bis der Kunde eines Tages den Fehler findet und uns eine Geldstrafe in Millionenhöhe auferlegt. In der Tat bin ich Versuch um überall zu finden, rufe ich den falschen Konstruktor auf - aber ich kann nicht herausfinden, wie ich Delphi dazu bringen kann, es mir zu sagen!

Antworten auf die Frage(12)

Ihre Antwort auf die Frage