在这个问题中,您可以看到可以创建一个添加abstractkeywrod 的抽象类.我正在Delphi中翻译一个项目,但我发现它允许创建一个抽象类.这是代码:
type
TCableSPF = class abstract
//code
end;
Run Code Online (Sandbox Code Playgroud)
这是一个抽象类,当然我有很多实现它的子类.顺便说一句,我看到可以创建一个这样的实例;
a := TCableSPF.Create;
Run Code Online (Sandbox Code Playgroud)
当我尝试调用其虚拟和抽象的方法时,我得到了错误,这是可以的,但我可以阻止创建类吗?或者Delphi默认允许这个?谢谢您的帮助
这class abstract是Delphi for .Net日子的延续.
由于未知原因,此关键字后面没有(当前)实现.
如果要阻止抽象类的实例化,此关键字将无济于事.而是执行以下操作:
type
TCableSPF = class abstract
//code
strict protected
//Define all constructors for an abstract class as protected.
constructor Create; virtual; reintroduce;
end;
Run Code Online (Sandbox Code Playgroud)
通过将所有构造函数定义为protected,只有后代对象可以访问构造函数,其他代码无法访问构造函数.
因为您重新引入了虚拟构造函数,所以您也无法使用以下方法对其进行实例化:
unit A;
type
TMyAbstractObject = class abstract(TObjectX)
strict protected
constructor Create; virtual; reintroduce;
end;
...
unit B;
TMyClass = class of TObjectX;
AbstractObjectInstance = TMyClass.Create; //Will not work for TMyAbstractObject
Run Code Online (Sandbox Code Playgroud)
请注意,您应该不声明构造override.而是声明它virtual reintroduce(或者只是reintroduce如果你不想允许虚拟构造函数).