在Delphi中,是否可以使用RTTI(或其他方法)来检查一个类是否被声明为抽象类? 类似于:
TMyAbstractClass = class abstract(TObject)
// ...
end;
...
if IsAbstract(TMyAbstractClass.ClassInfo) then
ShowMessage('Yeah')
else
ShowMessage('Computer says no...');
在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;
真正重要的是类是否有任何抽象方法。您可以相对容易地检查这一点。查看类的VMT。包含指向System._AbstractError
的指针的任何虚拟方法插槽都是抽象方法。棘手的部分是知道要检查多少个虚拟方法插槽,因为没有记录。Allen Bauer演示了如何做到这一点在另一个问题的答案中,但在评论中,Mason Wheeler指出它可能会返回比应该更大的值。他提到{{link3:GetVirtualMethodCount
}}函数来自{{link4:JCL}},应该给出用户定义虚拟方法的更准确计数。使用该函数和{{link5: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;
TStrings
或TStream
,然后想知道为什么他们的代码会因此崩溃。 - Remy Lebeau