Обновление: Пример, который я изначально имел, был довольно сложным. Вот простой 8-строчный пример, который объясняет все в одном блоке кода. не компилируется выдает предупреждение:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
Примечание: Этот вопрос является частью третьей в моей текущей серии вопросов о тонкостях конструкторов в Delphi
Как я могу добавить конструктор к существующему классу?
Давайте дадим гипотетический пример (то есть тот, который я набираю здесь в редакторе SO, чтобы он мог или не мог компилироваться):
TXHTMLStream = class(TXMLStream)
public
...
end;
Далее предположим, что нормальное использование TXHTMLStream
требовал выполнения большого количества повторяющегося кода, прежде чем его можно было использовать:
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename);
xs.Encoding := UTF32;
xs.XmlVersion := 1.1;
xs.DocType := 'strict';
xs.PreserveWhitespace := 'true';
...
xs.Save(xhtmlDocument);
Предположим, я хочу создать конструктор, который упрощает весь этот шаблонный установочный код:
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;
Это упрощает использование объекта до:
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename, UTF32);
xs.Save(xhtmlDocument);
За исключением того, что теперь Delphi жалуется, что мой новый конструктор скрывает старый конструктор.
Метод 'Create' скрывает виртуальный метод базового типа 'TXMLStream'
я, конечно же, не имел в виду , чтобы скрыть создание предка - я хочу оба.
Как добавить конструктор (с другой ] сигнатурой) к классу-потомку, сохранив конструктор предка, чтобы его можно было использовать?