Обновление: Пример, который я первоначально имел, был довольно сложным.Вот простой пример из 8 строк, который объясняет все в одном блоке кода.Следующий не компилируется выдает предупреждение:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
Примечание: Этот вопрос является частью 3 из моей продолжающейся серии вопросов о тонкостях конструкторов в 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 жалуется, что мой новый конструктор скрывает старый конструктор.
Метод «Создать» скрывает виртуальный метод базового типа «TXMLStream»
я определенно не означает дляскрыть предка создания - я хочу оба.
Как добавить конструктор (с другой подписью) в класс-потомок,сохраняя конструктор предка, чтобы его можно было использовать?