Delphi: Wann werden verdeckte Vorfahren wieder eingeführt und wann werden sie angezeigt?
Heut Kürzlich habe ich bei Stackoverflow gelernt, dass:
reintroduce wird verwendet, umausblende ancestor constructorsreintroduce wird verwendet, umSho ancestor constructorsIch habe versucht, einen Sinn daraus zu machen. Hier ist eine weitere, sehr spezifische Frage:Unterstützung meiner Hauptfrage zum Thema Konstruktoren.
Aktualisieren hat die gesamte Frage ersetzt:
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;
Wenn TCellPhone erstellt wird, stehen 3 Konstruktoren zur Verfügung:
Cup: IntegerCup: Integer; Teekanne: string [Teekanne: String = '']Frage: Warum istconstructor(Teapot: string='')
nicht versteckt?
Nun habe ich einen 3. Nachkommen hinzugefügt:
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;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
end;
Bei der KonstruktionTiPhone
vier Konstruktoren sind verfügbar:
Warum sind da vier Konstrukteure? Ich habe eine der drei bestehenden überschrieben.Bearbeiten Das mag ein Fehler in der Code-Einsicht sein, es zeigt mir vier - aber wie könnte ich dann möglicherweise anrufen, wenn zwei gleich sind.
Verwenden Sie den Originalcode erneut:
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;
Es ist bereits bekannt, dassTCellPhone
hat drei Konstruktoren:
Wie ändere ich die Deklaration vonTCellPhone
um den Ahnenkonstruktor auszublenden? z.B. damit
TNokia = class(TCellPhone)
end;
wird nur zwei Konstruktoren haben:
Cup: IntegerCup: Integer; Teekanne: stringNun für den Fall, dassreintroduce
wird verwendet, um einen nicht virtuellen Vorfahren auszublenden. Im vorherigen FallTiPhone
hat vier Konstruktoren (im Idealfall gibt es nur zwei - mitTComputer
versteckt irgendwie seinen Vorfahren). Aber auch wenn ich @ nicht reparieren kaTComputer
, ich kann mich ändernTiPhone
um nur den einen zu haben:
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;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce;
end;
JetztTiPhone
hat nur einen Konstruktor:
Reintroduce wird normalerweise nur verwendet, um die Warnung zum Ausblenden von @ zu unterdrücke virtual Vorfahren. In diesem Fall
Create(Teapot: string = '')
ist nicht virtuell - dennoch kann ich wiedereinführen, um es zu verbergen.
Aberjetz, wenn ich ein weiteres überladenes zu @ hinzufüTiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
Dann kommen plötzlich die (bisher verborgenen) Vorfahren zurück:
TiPhone.Create (7); TiPhone.Create ('pink'); TiPhone.Create (7, 'pink'); TiPhone.Create ();Wie Sie sehen können, habe ich Mühe, die Logik von @ zu versteh
wenn etwas versteckt istwie man etwas verstecktwenn etwas gezeigt wirdwie man etwas zeigt