【问题标题】:Delphi abstract class avoid implementationDelphi抽象类避免实现
【发布时间】:2017-05-28 13:23:01
【问题描述】:

this 问题中,您看到可以创建一个添加abstract 关键字的抽象类。我正在用 Delphi 翻译一个项目,但我看到它允许创建一个抽象类。这是代码:

type
 TCableSPF = class abstract
  //code
end;

这当然是一个抽象类,我有很多实现它的子类。顺便说一句,我认为可以创建这样的实例;

a := TCableSPF.Create;

当我尝试调用它的虚拟和抽象方法时,我得到了错误,这没关系,但我可以阻止创建类吗?还是 Delphi 默认允许这样做?感谢您的帮助

【问题讨论】:

  • 这是一个已知问题:quality.embarcadero.com/browse/RSP-10235
  • 经过一番谷歌搜索,我找到了一个选项{$WARN CONSTRUCTING_ABSTRACT ERROR},但是,我查看了RADStudio's Tokyo documentation(在@SebastianProske显示的链接中引用),不幸的是发现了以下注释:“Delphi 允许实例化声明为抽象的类,以实现向后兼容性,但不应再使用此功能”。 :-/

标签: delphi


【解决方案1】:

class abstractDelphi for .Net 天的延续。
由于未知的原因,此关键字后面没有(当前)实现。

如果你想阻止抽象类的实例化,这个关键字将无济于事。而是执行以下操作:

type
  TCableSPF = class abstract
  //code
strict protected
  //Define all constructors for an abstract class as protected.
  constructor Create; virtual; reintroduce;
end;

通过将所有构造函数定义为受保护,只有后代对象可以访问构造函数,其他代码不能访问构造函数。
因为你重新引入了虚拟构造函数,你也不能使用它来实例化它:

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

【讨论】:

  • 非常感谢。这与 C++ 所做的相同,因为它没有 abstract 关键字。顺便说一句,我必须使用我看到的解决方法。我希望他们能解决这个问题,因为这很烦人:/
  • 为什么要重新引入而不是覆盖?那是因为抽象的定义没有实现吗?
  • .net 编译器中有实现。
  • @EmmaRossignoli,将其声明为 override 会破坏整个目的,因为您可以使用类构造函数的类(其他语言称为类工厂构造)实例化隐藏构造函数,使用构造函数。
  • 不一定,@Victoria。通过元类变量创建抽象类不会导致编译器发出警告。
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2016-10-02
相关资源
最近更新 更多