更新:我最初提供的例子有点复杂。这里是一个简单的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”的虚方法
我肯定不是想隐藏祖先的create - 我希望两个都存在。
如何在一个派生类中添加一个构造函数(具有不同的签名),同时保留祖先构造函数,以便仍然可以使用它?
reintroduce
只是抑制警告,它并没有做更多的事情,也不会隐藏任何东西。真正隐藏基类方法的是使用相同名称但未覆盖它的方法。 - Sertac Akyuzreintroduce
的作用等同于本地形式的“禁止警告 W1010”。它只有这个作用。 - Muhammad Alkarouri