Delphi: Wie füge ich einem Nachkommen einen anderen Konstruktor hinzu?
Aktualisieren Das Beispiel, das ich ursprünglich hatte, war irgendwie komplex. Hier ist ein einfaches 8-zeiliges Beispiel, das alles in einem Codeblock erklärt. Folgendekompiliert nicht gibt eine Warnung aus:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
Hinweis Diese Frage ist Teil 3 meiner fortlaufenden Reihe von Fragen zu den Feinheiten von Konstruktoren in Delphi
Ursprüngliche FrageWie kann ich einer vorhandenen Klasse einen Konstruktor hinzufügen?
Lassen Sie uns ein hypothetisches Beispiel geben (d. H. Eines, das ich hier im SO-Editor eingebe, damit es kompilieren kann oder nicht):
TXHTMLStream = class(TXMLStream)
public
...
end;
Weiter angenommen, dass die normale Verwendung vonTXHTMLStream
bedeutete, dass viele Code-Wiederholungen durchgeführt wurden, bevor sie verwendet werden konnten:
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename);
xs.Encoding := UTF32;
xs.XmlVersion := 1.1;
xs.DocType := 'strict';
xs.PreserveWhitespace := 'true';
...
xs.Save(xhtmlDocument);
ngenommen, ich möchte einen Konstruktor erstellen, der den gesamten Setup-Code für das Boilerplate vereinfacht:
TXHTMLStream = class(TXMLStream)
public
constructor Create(filename: string; Encoding: TEncoding); virtual;
end;
constructor TXHTMLStream.Create(filename: string; Encoding: TEncoding);
begin
inherited Create(filename);
xs.Encoding := Encoding;
xs.XmlVersion := 1.1;
xs.DocType := 'strict';
xs.PreserveWhitespace := True;
...
end;
Das vereinfacht die Verwendung des Objekts für:
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename, UTF32);
xs.Save(xhtmlDocument);
Außer jetzt beschwert sich Delphi, dass mein neuer Konstruktor den alten Konstruktor versteckt.
Method 'Create' verbirgt die virtuelle Methode des Basistyps 'TXMLStream'
Ich habe sicherlich nichtbedeute um den Ahnen zu verbergen, erstelle - iwolle beide
Wie füge ich einen Konstruktor hinzu (mit einemander signature) für eine abgeleitete Klasse, wobei der Konstruktor für Vorfahren beibehalten wird, damit er weiterhin verwendet werden kann?