我创建了一个组件,它的自身永远不应该被实例化,而是它必须被继承。类似的概念TThread
。我可以对这个组件做些什么来确保它永远不会被自己实例化而不被继承?例如,当对象被实例化时,引发一个需要继承该类的异常,或者如果可能的话,甚至不要让任何项目在尝试此组件库的实例时进行编译。
问问题
246 次
2 回答
5
在 XE2 中,您可以将类声明为抽象类:
type TMyclass = class abstract (TAncestor)
更新:似乎 Delphi 仍然允许创建抽象类(尽管某些版本的文档说它不允许)。编译器应该给出警告。
可能您的类有一些必须重写的虚拟方法(这就是为什么必须继承它的原因)。如果是这样,只需创建方法abstract
,在基类中调用它时就会得到异常。
于 2013-11-02T22:23:46.143 回答
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;
这种情况也是创建您自己的异常类型的一种情况。
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;
于 2013-11-03T19:28:28.990 回答