如何定义必须继承的基类?

Jer*_*dge 6 delphi inheritance delphi-xe2

我已经创建了一个组件,它的self不应该被实例化,而是必须继承它.类似的概念TThread.我可以对这个组件做些什么来确保它永远不会被自己实例化而不被继承?例如,在实例化对象时,引发一个异常,即需要继承该类,或者如果可能,甚至不要让任何项目在尝试此组件库的实例的地方进行编译.

nul*_*ptr 5

在XE2中,您可以将类声明为abstract:

type TMyclass = class abstract (TAncestor)
Run Code Online (Sandbox Code Playgroud)

Upd:似乎Delphi仍然允许创建抽象类(尽管某些版本的文档说它没有).编译器应该发出警告.

可能你的类有一些必须被覆盖的虚方法(这就是它必须从中继承的原因).如果是这样,只需创建方法abstract,当在基类中调用它时,您将获得异常.

  • 在Delphi 2009中,我甚至没有得到警告,并且制作这样的`abstract`类的实例没有问题.我个人会这样做[`这样!](http://pastebin.com/RDMD6pMU). (3认同)
  • @TLama谢谢!这是疯狂的,如果可以实例化抽象类的重点是什么?我记得有些文档告诉他们不能. (2认同)
  • 我喜欢这个邪恶的课程:-)让代码成为答案,我会改变我接受的答案 (2认同)

Jer*_*dge 3

TLama在评论中提到了这一点,但从未给出答案,所以我来回答一下。

type
  TEvilClass = class
  public
    constructor Create;
  end;

  TGoodClass = class(TEvilClass)

  end;

{ TEvilClass }

constructor TEvilClass.Create;
begin
  if ClassType = TEvilClass then
    raise Exception.Create('I''m the evil class which cannot be instantiated!');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  EvilClass: TEvilClass;
begin
  EvilClass := TEvilClass.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  GoodClass: TGoodClass;
begin
  GoodClass := TGoodClass.Create;
end;
Run Code Online (Sandbox Code Playgroud)

这种情况对于创建您自己的异常类型也是有意义的。

type
  EvilClassException = Exception;

  TEvilClass = class(TComponent)
  public
    constructor Create(AOwner: TComponent); override;
  end;

  ...

constructor TEvilClass.Create(AOwner: TComponent);
begin
  inherited;
  if ClassType = TEvilClass then
    raise EvilClassException.Create('I''m the evil class which cannot be instantiated!');
end;
Run Code Online (Sandbox Code Playgroud)

  • 我会在你的回答中给@TLama一些积分,并添加他发布的链接。我有点喜欢 TEvilClass/TGoodClass 的例子:) (4认同)