gpt4 book ai didi

delphi - 如何检查Delphi类是否声明为抽象类?

转载 作者:行者123 更新时间:2023-12-03 15:00:44 25 4
gpt4 key购买 nike

在Delphi中是否可以使用RTTI(或其他东西)来检查一个类是否被声明为抽象类?像这样的东西:

TMyAbstractClass = class abstract(TObject)
// ...
end;

...

if IsAbstract(TMyAbstractClass.ClassInfo) then
ShowMessage('Yeah')
else
ShowMessage('Computer says no...');

最佳答案

我没有足够新的版本来直接回答您的问题,但请记住,是否抽象并不真正重要。所做的只是让编译器阻止您直接在类上调用构造函数。如果将类引用放入类引用变量中,编译器将允许您调用该变量的构造函数,并且在运行时您将拥有一个假定不可实例化的类的实例。

var
c: TClass;
o: TObject;
begin
c := TMyAbstractClass;
o := c.Create;
Assert(o is TMyAbstractClass);
end;

真正重要的是类是否有抽象方法。您可以很容易地检查这一点。查看类(class)的 VMT。任何包含指向 System._AbstractError 的指针的虚拟方法槽都是抽象方法。棘手的部分是知道要检查多少个虚拟方法槽,因为这没有记录。 Allen Bauer demonstrated how to do that在对 another question 的回答中,但在评论中 Mason Wheeler 指出它可能返回比应有的更大的值。他提到了GetVirtualMethodCount来自 JCL 的函数,这应该可以更准确地计算用户定义的虚拟方法。使用该功能和 GetVirtualMethod ,同样从 JCL 中,我们得到这个函数:

function HasAbstractMethods(c: TClass): Boolean;
var
i: Integer;
begin
Result := True;
for i := 0 to Pred(GetVirtualMethodCount(c)) do
if GetVirtualMethod(c, i) = @_AbstractError then
exit;
Result := False;
end;

如果一个抽象类没有抽象方法,那么它到底能有多抽象呢?它必须被标记为抽象,以防止开发人员创建它的实例,但如果您真的愿意,您无论如何都可以创建它的实例,因此标记抽象类实际上更多的是警告,而不是对使用的任何实际限制。

关于delphi - 如何检查Delphi类是否声明为抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com