2010-04-23 88 views
2

我打了属性和假定它们是继承,但它似乎不那么:属性不会继承?

type 
    [MyAttribute] 
    TClass1 = class 
    end; 

    TClass2 = class(TClass1) 
    end; 

TClass2不具备属性“MyAttribute”虽然从1类继承。有没有可能使某个属性可以继承?或者我必须上课并搜索属性?

回答

3

属性是类或其他符号(如方法)的装饰。一个属性装饰声明,但不是该类的一个特征。结果,属性不被继承。

是的,你可以去类层次结构寻找属性,但有一个更好的解决方案。使用空接口(IMyInterface = Interface)作为“标记”接口。接口实现类的所有后代也将是该接口的实现者。所有你需要确保的是你的基类实现了IInterface,如果你的基类是从TInterfacedObject或TComponent继承下来的话,情况就已经如此。

完成此操作后,可以使用Supports函数来测试类或其祖先之一是否实现接口。

0

我从来没有在德尔福使用属性 - 所以这个答案是一种猜测。但是我知道Java中的注释基本上是一样的。

但是,如果它们没有被继承,它是有意义的:子类可能需要其他属性,或者与超类的属性相矛盾。另外,如果属性不被继承,如果“你的”属性用例需要,你有机会跟随层次结构。如果他们被继承了,你将难以检测一个属性是否实际上是在一个特定的类上,而不是它的任何超类。

如果您需要继承并且不想查看超类,那么使用类函数或类属性甚至标记接口(不声明方法)可能更有意义。那些是遗传的。

+0

我使用窗体继承并具有控制这些窗体的单元测试的属性。我希望所有的子类/表单都被自动测试......现在我向上迭代类层次结构来查看这个属性是否存在。 – 2010-05-15 14:28:25

+1

类函数是一个更好的解决方案 – 2011-04-24 13:25:31