2017-05-28 78 views
5

this问题你看到,可以创建一个抽象类添加abstract keywrod。我在Delphi中翻译了一个项目,但我发现它允许创建一个抽象类。这是代码:德尔福抽象类避免执行

type 
TCableSPF = class abstract 
    //code 
end; 

这是一个抽象类当然,我有很多实现它的子类。顺便说一下,我看到有可能创建一个这样的实例;

a := TCableSPF.Create; 

当我尝试调用它的方法是虚拟和抽象的我得到的错误,这是确定的,但我可以防止类的创建?或者Delphi默认允许这个?感谢您的帮助

+1

这是一个已知问题:https://quality.embarcadero.com/browse/RSP-10235 –

+0

经过一些Google搜索后,我发现了一个选项'{$ WARN CONSTRUCTING_ABSTRACT ERROR}',但是,我看了一下[ RADStudio的东京文档](http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Classes_and_Objects)(在由@SebastianProske显示的链接中引用),并且不幸发现了以下注释:“_Delphi允许实例化一个声明为抽象的类,为了向后兼容,但不应该再使用此功能_“。 : -/ – silvioprog

回答

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)。

+0

非常感谢。这与C++所做的一样,因为它没有abstract关键字。顺便说一句,我必须使用我看到的解决方法。我希望他们会解决这个问题,因为它很烦人:/ –

+0

为什么我应该重新引入而不是重写?那是因为抽象没有实现的定义? –

+0

.net编译器后面有一个实现。 –