Frage

Hier zwei einfache Klassen, zunächst beide keine Keywords (virtuell, Überlast, Überschreibung, reintroduce):

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

TCellPhone = class(TComputer)
public
   constructor Create(Teapot: Integer; Handle: string);
end;

Ich werde diese oben defintions als etwas kürzer darstellen:

TComputer = class(TObject)
   constructor Create(Teapot: Integer);

TCellPhone = class(TComputer)
   constructor Create(Teapot: Integer; Handle: string);

Und bei der Konstruktion TCellPhone gibt es nur einen Konstruktor (int, string) - weil der Vorfahr Konstruktor versteckt wurde. ich werde die sichtbaren Konstrukteure TCellPhone zeigen wie:

  • Teekanne: Integer; Griff: string

Jetzt für die Frage, die ersten drei Fälle sinnvoll, die vierte nicht:

1. Vorfahr Konstruktor wird durch Nachkommen versteckt:

TComputer = class(TObject)
   constructor Create(Teapot: Integer);

TCellPhone = class(TComputer)
   constructor Create(Teapot: Integer; Handle: string);
  • Teapot: Integer; Handle: string

Das macht Sinn, der Vorfahr Konstruktor versteckt, weil ich einen neuen Konstruktor deklariert haben.

2. Vorfahr virtueller Konstruktor wird durch Nachkommen versteckt:

TComputer = class(TObject)
   constructor Create(Teapot: Integer); virtual;

TCellPhone = class(TComputer)
   constructor Create(Teapot: Integer; Handle: string);
  • Teapot: Integer; Handle: string

Das macht Sinn, der Vorfahr Konstruktor versteckt, weil ich einen neuen Konstruktor deklariert haben.

  

Hinweis: Da der Vorfahr virtuell ist: Delphi wird Sie warnen, dass   Sie versteckt den virtuellen Vorfahren (in   Das vorherige Beispiel des Versteckens a   statische Konstruktor: Niemand kümmert sich darum, so   Keine Warnung). Die Warnung kann sein   unterdrückt ( „Yeah yeah yeah bedeutet,   Ich bin ein virtueller Konstruktor versteckt. ich    bedeutet , das zu tun ") durch Zusatz von reintroduce .

    TComputer = class(TObject)
       constructor Create(Teapot: Integer); virtual;

    TCellPhone = class(TComputer)
       constructor Create(Teapot: Integer; Handle: string); reintroduce;

3. Vorfahr Konstruktor nicht wegen Überlastung in Nachkommen versteckt:

TComputer = class(TObject)
   constructor Create(Teapot: Integer);

TCellPhone = class(TComputer)
   constructor Create(Teapot: Integer; Handle: string); overload;
  • Teapot: Integer; Handle: string
  • Teapot: Integer

Das macht Sinn, da der Nachkomme Konstruktor ist eine Überlastung des Vorfahren, so dass beide dürfen anwesend sein. Der Vorfahr Konstruktor wird versteckt nicht zu werden.

4. Virtuelle Vorfahren Konstruktor nicht in Nachkommen versteckt, weil Überlastung - aber immer noch eine Warnung :

Dies ist der Fall, die keinen Sinn macht:

TComputer = class(TObject)
   constructor Create(Teapot: Integer); virtual;

TCellPhone = class(TComputer)
   constructor Create(Teapot: Integer; Handle: string); overload;
  • Teapot: Integer; Handle: string
  • Teapot: Integer

    Die Methode 'Create' Häute virtuelle Methode des Basistypen 'TComputer'

Das macht wenig Sinn. Nicht nur ist der Vorfahr nicht versteckt, ist der Nachkomme überlastet; es sollte nicht einmal sein beschweren.

Was soll das?

War es hilfreich?

Lösung

Delphi-Dokumentation sagt:

  

Wenn Sie eine virtuelle Methode überlasten, Verwendung   die reintroduce Richtlinie, wenn Sie   neu deklarieren sie in abgeleiteten Klassen.   Zum Beispiel:

type
  T1 = class(TObject)
    procedure Test(I: Integer); overload; virtual;
  end;
  T2 = class(T1)
    procedure Test(S: string); reintroduce; overload;
  end;

Ohne die reintroduce Richtlinie, es funktioniert immer noch, wie Sie vielleicht bemerkt haben, aber Sie werden die Warnung erhalten.

Auch Sie verstecken sich eigentlich TObject.Create, aber es hat nichts mit der Warnung zu tun. Wenn Sie denken, Sie Zugriff auf TObject.Create wollen vielleicht auch, dies zu tun:

type
  TComputer = class(TObject)
    constructor Create(Teapot: Integer); reintroduce; overload; virtual;
  end;

type
  TCellPhone = class(TComputer)
    constructor Create(Teapot: Integer; Handle: String); reintroduce; overload;
  end;

Andere Tipps

würde ich mit Trinidad zustimmen. Die Logik hinter der Warnung wahrscheinlich betrachtet nur, ob der Vorfahren Methode ist virtuell / dynamisch und ob ein Nachkomme Methode wird als Überschreibung oder reintroduce markiert.

Dies gilt auch für „normale“ Methoden als auch.

Es kann, indem man reintroduce vor dem overload Modifikator oder durch Zugabe eines überschriebenen Konstruktor der abgeleiteten Klasse unterdrückt werden, dass einfach Delegierten der Vorfahr-Konstruktor.

Ich habe schon bemerkt. Die Warnung ist ein Fehler, soweit ich das beurteilen kann, weil die geerbte Methode nicht verborgen ist. Sollte bei qc.embarcadero.com gemeldet werden, wenn es nicht bereits ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top