如何在类重载时隐藏继承的TObject构造函数?

Jav*_*vid 20 delphi

看看这堂课:

TTest = class(TObject)  
public  
  constructor Create(A:Integer);overload;  
  constructor Create(A,B:Integer);overload;  
end;
Run Code Online (Sandbox Code Playgroud)

现在,当我们想要使用该类时:

var  
  test:  TTest;  
begin  
  test:= TTest.Create; //this constructor is still visible and usable!  
end;
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我隐藏这个构造函数吗?

Dav*_*nan 19

只要你有重载的构造函数命名Create,你就无法TObject在派生时隐藏无参数构造函数TObject.

这将在这里讨论:http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

如果你准备在你的班级之间另外上课,TObject你可以使用Andy Hausladen的诀窍:

TNoParameterlessContructorObject = class(TObject)
strict private
  constructor Create;
end;

TTest = class(TNoParameterlessContructorObject)
public
  constructor Create(A:Integer);overload;  
  constructor Create(A,B:Integer);overload;  
end;
Run Code Online (Sandbox Code Playgroud)

  • 这是一般的.派生类(即每个类)中的任何重载方法都会自动使继承的方法重载. (3认同)

Uwe*_*abe 11

您可以通过引入非重载的Create来隐藏继承的Create.由于您需要两个重载的Create,您可以使用可选的第二个参数将它们合并为一个Create:

TTest = class(TObject)  
public  
  constructor Create(A:Integer; B: Integer = 0); 
end;
Run Code Online (Sandbox Code Playgroud)

这将给出编译器警告,表示您正在隐藏默认的无参数构造函数.要摆脱警告,您可以声明隐藏构造函数,如下所示:

TTest = class(TObject)  
public  
  constructor Create(A:Integer; B: Integer = 0); reintroduce;
end;
Run Code Online (Sandbox Code Playgroud)

或者,如果这不可行,您可以引入一个介绍第一个create的中间类,然后引入带有重载的第二个类的最终类:

preTest = class(TObject)  
public  
  constructor Create(A:Integer); reintroduce;
end;

TTest = class(preTest)  
public  
  constructor Create(A,B:Integer);overload;  
end;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我讨论的时间有点晚,但是第一个代码片段不会引起警告,因为`TObject.Create`不是虚拟的或动态的.这也是为什么"重新引入"没有效果而根本不需要的原因. (2认同)