我开始学习 Delphi 时读到,避免无用的调用不带参数的 Create 构造函数的唯一方法是在其中抛出异常或断言。 本周我第一次使用 reintroduce 关键字时,发现它似乎也解决了这个问题。
Test = class
private
n_ : Integer;
public
constructor Create(n : Integer); reintroduce;
end;
调用Test.Create
会给我想要的编译器错误。这种方法有什么问题吗?
问题很简单:如果你重新引入一个方法,它将隐藏父类的方法。这正是你想要的,但请检查以下代码:
type
TClassParent = class
public
procedure DoSomething; overload;
procedure DoSomething(Something: Integer); overload;
end;
TClassChild = class(TClassParent)
public
procedure DoSomething(SomethingElse: string); reintroduce;
end;
var
Child: TClassChild;
begin
Child := TClassChild.Create;
Child.DoSomething;
Child.DoSomething(1024);
Child.DoSomething('Something');
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
如果您使用另一种签名定义构造函数,则会有效地隐藏其他构造函数,因此会出现警告。指令 reintroduce 告诉编译器您知道自己在做什么,因此不会显示警告。
因此,唯一的影响是隐藏先前的构造函数。
如果您想要多个构造函数变体,则可以使用 overload 指令。