当我开始使用Delphi时,我读到了避免无参数Create构造函数无用调用的唯一方法是在其中抛出异常或断言。 当我本周第一次使用reintroduce关键字时,我发现它似乎也解决了这个问题。
Test = class
private
n_ : Integer;
public
constructor Create(n : Integer); reintroduce;
end;
对Test.Create
的调用给了我所需的编译器错误。这种方法有什么问题吗?
答案 0 :(得分:4)
嗯,简单问题:如果重新引入方法,它将隐藏父方法。这应该是你想要的,但请检查以下代码:
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');
这会给你两个错误!为什么?因为父级中的两个DoSomething方法现在都隐藏了!有时,你想要这个。其他时候,你没有。如果不这样做,则需要再次将这些缺少的方法添加到子类中,调用这样的继承方法:
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
然后,这就是你想要的,对吧?隐藏具有相同名称的所有父方法。但是不要忘记你仍然可以调用继承的方法
将接口链接到父类时也要注意。子类仍将支持接口,但是通过接口而不是对象调用方法将导致调用父对象而不是子对象!
如果要隐藏方法,重新引入方法是一种很好的做法。家长。但它也会隐藏具有相同名称的虚拟方法!通常情况下,覆盖虚拟方法会更好,但是在更改参数列表时,使用重新引入实际上会在正常情况下从类外部禁用父类。在课堂上,你仍然可以访问它们,没有任何警告......
答案 1 :(得分:1)
如果使用其他签名定义构造函数,则会有效地隐藏其他构造函数,从而隐藏警告。指令重新引入告诉编译器您知道自己在做什么,因此它不会显示警告。
所以唯一的效果就是你隐藏了以前的构造函数。
如果您想要构造函数的多个变体,可以使用重载指令。