当我开始使用Delphi时,我读到了避免无参数Create构造函数无用调用的唯一方法是在其中抛出异常或断言.当我本周第一次使用reintroduce关键字时,我发现它似乎也解决了这个问题.
Test = class
private
n_ : Integer;
public
constructor Create(n : Integer); reintroduce;
end;
Run Code Online (Sandbox Code Playgroud)
调用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');
Run Code Online (Sandbox Code Playgroud)
这给你带来了两个错误!为什么?因为父级中的两个 DoSomething 方法现在都被隐藏了!有时,你想要这个。其他时候,你不需要。当你不这样做时,你需要再次将那些缺少的方法添加到子类中,调用继承的方法,如下所示:
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
Run Code Online (Sandbox Code Playgroud)
话又说回来,这就是你想要的,对吗?隐藏所有同名的父方法。不过,请不要忘记您仍然可以调用继承的方法。
将接口链接到父类时还要注意。子类仍然支持接口,但通过接口而不是对象调用方法将导致调用父类,而不是子类!
如果您想向父级隐藏方法,重新引入方法是一个很好的做法。不过,它还会隐藏同名的虚拟方法!通常情况下,重写虚方法会更好,但是当更改参数列表时,使用重新引入实际上会在正常情况下从类外部禁用父类。在课堂上,您仍然可以访问它们,没有任何警告......
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |