更新:我最初的例子有点复杂。这是一个简单的 8 行示例,它在一个代码块中解释了所有内容。以下不编译给出警告:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
注意:这个问题是我正在进行的关于 Delphi 构造函数的微妙之处的系列问题的第 3 部分
原始问题
如何将构造函数添加到现有类?
让我们举一个假设的例子(即我在 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”的虚拟方法
我当然不是有意隐藏祖先的创造——我想要两者。
如何将构造函数(具有不同的签名)添加到后代类,同时保留祖先构造函数以便它仍然可以使用?