2011-03-10 64 views
17

我有这些类和过程:如何确定一个Delphi对象是否具有特定的类而不是任何后代类?

TParent = class(TObject); 
TChild1 = class(TParent);  
TChild2 = class(TParent); 

Procedure DoSomething(obj:TParent); 

我想要做的是,当objTParent,而不是一个后代引发异常。

我想过做这样的事情:

if obj.classname = TParent.classname then raise exception.create.... 

,但它似乎有点的hackish(TM)

更多:是我的本意是为了能够通过该共享属性的对象/共同的程序。经过深思熟虑,TParent对象根本不需要,我需要的是我的答案中显示的接口对象。

+0

从已经给出的答案公寓,当然有有效的情况下想要这个,但没有那么多。你为什么需要知道? – 2011-03-10 07:05:23

+4

+1因为认为这是一个黑客。作为一个经验法则,如果你用* strings *做类型相关的事情,你可能做错了什么。 – 2011-03-10 08:02:10

回答

0

我认为我解决了我想要做的事情,它昨晚打我的头。

iParentInterface = interface(IUnknown); 
TChild1 = class(TInterfacedObject,iParentInterface);  
TChild2 = class(TInterfacedObject,iParentInterface); 

Procedure DoSomething(obj:iParentInterface); 
11

你在正确的轨道上,但不是比较类名,而是检查ClassType属性更简单。

if obj.ClassType = TParent then raise exception.create.... 
+5

不仅更简单,而且*更正确*。两个班可能有相同的名字,但不能是同一班。 ('ClassName'函数不包含单元名称,否则会区分类命名的类。不知道它对嵌套类有什么作用。) – 2011-03-10 07:55:26

+2

@Rob它很明显:'TOuter.TInner'。 – 2011-03-11 00:49:31

+1

文档说应该使用关键字* is *而不是按ClassType进行比较。 – StanE 2015-01-24 23:26:16

30

你可能会发现以下TObject类方法有用:

  • ClassType - 返回对象的类
  • ClassParent的 - 给人的父类的类
  • InheritsFrom的 - 返回一个类是否从另一个类继承(即,检查整个继承链)。它包括当前课程。

所以,你可以达到你想要的东西(从TParent下降,但不TDescendant?)的东西,如下面的代码(未经测试,没有德尔福在这一刻):

if obj.ClassType.InheritsFrom(TParent) 
    and not obj.ClassType.InheritsFrom(TDescendant) then... 

或者如果我误解,你只是想看看如果对象是一个TParent,并没有任何一种的后代在所有尝试:

if obj.ClassType = TParent then... 

德尔福遥遥领先其时间通过提供接入类metaclasses,所以宁可只需检查类名称即可访问实际的类对象。

+2

也许会过时,但仍然落后于Smalltalk! – 2011-03-10 11:24:10

+0

是的,我很想在我的回答中添加一个Smalltalk评论:) – 2011-03-10 22:40:22

2

另一种方法:在TParent中引入抽象方法,如CheckValidChild,并在子类中重写它。现在,当您拨打obj.CheckValidChild时,如果obj的实例属于TParent类,您将收到EAbstractError

11

面向对象编程的良好实践表明,不应该这样做。你所描述是直接违反了Liskov substitution principle,其中规定:在程序

对象应该 更换他们的 亚型的情况下,不改变 正确性该程序

我的认为你应该解释你试图解决什么问题,然后一个更好的方法可能会变得明显。

+0

Liskov SP的+1。 – 2011-03-10 21:25:57

+2

这是我需要的微调, – 2011-03-11 00:34:41

相关问题