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 constructors

Ich 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:

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

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:

Cup: IntegerCup: Integer; Teekanne: string [Teekanne: String = '']

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: string

Nun 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:

Cup: Integer

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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage