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:
Was mache ich mitTCellPhone
damit der Ahnenkonstruktor Teapot: string = ''
) ist nicht sichtbar, es bleiben nur die deklarierten Konstruktoren:
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: IntegerUnd 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 wiGeschwisteWie 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 QuestionIch 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!