我有这些类(class)和一个过程:
TParent = class(TObject);
TChild1 = class(TParent);
TChild2 = class(TParent);
Procedure DoSomething(obj:TParent);
我想做的是当 obj
是 TParent
而不是后代时引发异常。
我想过做这样的事情:
if obj.classname = TParent.classname then raise exception.create....
但这似乎有点hackish(TM)
更多:我的目的是能够传递共享属性/过程的对象。经过更多思考,根本不需要 TParent 对象,我需要的是我的答案中显示的接口(interface)对象。
最佳答案
您可能会发现以下 TObject
类方法很有用:
- ClassType - 返回对象的类
- ClassParent - 给出该类的父类
- InheritsFrom - 如果一个类继承于另一个类则返回(即检查整个继承链)。它包括当前类(class)。
因此,您可以使用以下代码(未经测试,目前没有 Delphi)来实现您想要的(从 TParent 下降,但不是 TDescendant?):
if obj.ClassType.InheritsFrom(TParent)
and not obj.ClassType.InheritsFrom(TDescendant) then...
或者,如果我误解了,而您只是想查看一个对象是否是 TParent,而不是任何类型的后代,请尝试:
if obj.ClassType = TParent then...
Delphi 远远领先于时代,通过 metaclasses 提供对类的访问。 ,因此您不仅可以检查类名,还可以访问实际的类对象。
关于delphi - 如何确定 Delphi 对象是否属于特定类而不是任何后代类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5255341/