在this问题中,您看到可以创建一个添加abstract
keywrod的抽象类。我正在Delphi中翻译一个项目,但我发现它允许创建一个抽象类。这是代码:
type
TCableSPF = class abstract
//code
end;
这是一个抽象类,当然我有很多实现它的子类。顺便说一句,我看到可以创建一个像这样的实例;
a := TCableSPF.Create;
当我尝试调用其虚拟和抽象的方法时,我得到了错误,这是可以的,但我可以阻止创建类吗?或者Delphi默认允许这个?谢谢你的帮助
答案 0 :(得分:7)
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;
通过将所有构造函数定义为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
请注意,您应不声明构造函数override
。如果您不想允许虚拟构造函数,请将其声明为virtual reintroduce
(或仅reintroduce
。