Delphi:如何向后代添加不同的构造函数?

标签 delphi constructor delphi-5 constructor-chaining

更新:我最初的例子有点复杂。这是一个简单的 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 提示我的新构造函数隐藏了旧构造函数。

Method 'Create' hides virtual method of base type 'TXMLStream'

我当然没有意思隐藏祖先的创造 - 我想要两者。

如何将构造函数(具有不同签名)添加到后代类,同时保留祖先构造函数,以便仍然可以使用它?

最佳答案

我的第一 react 是使用overload关键字,如下所示:

TCellPhone = class(TComputer)
public
    constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;

编辑:感谢 Ian 的编辑,它使我的答案有了答案。我想我是因为勇敢才得到它的,所以我将提供一个更完整的例子:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type

TComputer = class(TObject)
public
    constructor Create(Cup: Integer); virtual;
end;

TCellPhone = class(TComputer)
public
    constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;

{ TComputer }

constructor TComputer.Create(Cup: Integer);
begin
  writeln('constructed computer: cup = ', Cup);
end;

{ TCellPhone }

constructor TCellPhone.Create(Cup: Integer; Teapot: string);
begin
  inherited Create(Cup);
  writeln('constructed cellphone: Teapot = ', Teapot);
end;

var
  C1, C2, C3: TComputer;

begin
  C1 := TComputer.Create(1);
  Writeln;
  C2 := TCellPhone.Create(2);
  Writeln;
  C3 := TCellPhone.Create(3, 'kettle');
  Readln;
end.

结果是:

constructed computer: cup = 1

constructed computer: cup = 2

constructed computer: cup = 3
constructed cellphone: Teapot = kettle

关于Delphi:如何向后代添加不同的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3876484/

相关文章:

delphi - 在不同的 Delphi 版本之间发送 TStringList

delphi - 如何在 Firemonkey 中的 TEdit 中隐藏插入符号?

Delphi从不同的类级别调用函数

c++ - 动态内存和构造函数异常

c++ - 如何使用在构造函数中创建的对象

c++ - 调用构造函数的赋值运算符被破坏

delphi - 强制win8刷新映射驱动器

delphi - FastMM 无法检测内存泄漏

delphi - 在 Delphi 中使用消息内的某些变量更改 MessageBox 的标题

delphi - MD5 base64 哈希在 Delphi 中编译为 32 位或 64 位时是不同的 - 我怎样才能使它们相同?