当我开始使用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');
这给你带来了两个错误!为什么?因为父级中的两个 DoSomething 方法现在都被隐藏了!有时,你想要这个。其他时候,你不需要。当你不这样做时,你需要再次将那些缺少的方法添加到子类中,调用继承的方法,如下所示:
procedure TClassChild.DoSomething(SomethingElse: string);
begin
  inherited DoSomething(SomethingElse);
end;
话又说回来,这就是你想要的,对吗?隐藏所有同名的父方法。不过,请不要忘记您仍然可以调用继承的方法。
将接口链接到父类时还要注意。子类仍然支持接口,但通过接口而不是对象调用方法将导致调用父类,而不是子类!
如果您想向父级隐藏方法,重新引入方法是一个很好的做法。不过,它还会隐藏同名的虚拟方法!通常情况下,重写虚方法会更好,但是当更改参数列表时,使用重新引入实际上会在正常情况下从类外部禁用父类。在课堂上,您仍然可以访问它们,没有任何警告......
| 归档时间: | 
 | 
| 查看次数: | 256 次 | 
| 最近记录: |