关于delphi:如何定义必须继承的基类?

How to define a base class which must be inherited?

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


在XE2中,可以将类声明为抽象类:

1
type TMyclass = class abstract (TAncestor)

upd:看起来Delphi仍然允许创建抽象类(尽管一些版本的文档说它不允许)。不过,编译器应该给出警告。

可能您的类有一些必须重写的虚拟方法(这就是为什么它必须从继承的原因)。如果是这样,只需使方法abstract,当它在基类中被调用时,您将得到一个异常。


TLAMA在评论中提到了这一点,但从来没有人回答过,所以我会回答这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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;

这个场景对于创建自己的异常类型也是有意义的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;