隐藏无参数创建与重新引入?

时间:2010-11-18 09:38:15

标签: delphi oop

当我开始使用Delphi时,我读到了避免无参数Create构造函数无用调用的唯一方法是在其中抛​​出异常或断言。 当我本周第一次使用reintroduce关键字时,我发现它似乎也解决了这个问题。

Test = class
private
    n_ : Integer;
public
    constructor Create(n : Integer); reintroduce;
end;

Test.Create的调用给了我所需的编译器错误。这种方法有什么问题吗?

2 个答案:

答案 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)

如果使用其他签名定义构造函数,则会有效地隐藏其他构造函数,从而隐藏警告。指令重新引入告诉编译器您知道自己在做什么,因此它不会显示警告。

所以唯一的效果就是你隐藏了以前的构造函数。

如果您想要构造函数的多个变体,可以使用重载指令。