我打了属性和假定它们是继承,但它似乎不那么:属性不会继承?
type
[MyAttribute]
TClass1 = class
end;
TClass2 = class(TClass1)
end;
TClass2不具备属性“MyAttribute”虽然从1类继承。有没有可能使某个属性可以继承?或者我必须上课并搜索属性?
我打了属性和假定它们是继承,但它似乎不那么:属性不会继承?
type
[MyAttribute]
TClass1 = class
end;
TClass2 = class(TClass1)
end;
TClass2不具备属性“MyAttribute”虽然从1类继承。有没有可能使某个属性可以继承?或者我必须上课并搜索属性?
属性是类或其他符号(如方法)的装饰。一个属性装饰声明,但不是该类的一个特征。结果,属性不被继承。
是的,你可以去类层次结构寻找属性,但有一个更好的解决方案。使用空接口(IMyInterface = Interface)作为“标记”接口。接口实现类的所有后代也将是该接口的实现者。所有你需要确保的是你的基类实现了IInterface,如果你的基类是从TInterfacedObject或TComponent继承下来的话,情况就已经如此。
完成此操作后,可以使用Supports函数来测试类或其祖先之一是否实现接口。
我从来没有在德尔福使用属性 - 所以这个答案是一种猜测。但是我知道Java中的注释基本上是一样的。
但是,如果它们没有被继承,它是有意义的:子类可能需要其他属性,或者与超类的属性相矛盾。另外,如果属性不被继承,如果“你的”属性用例需要,你有机会跟随层次结构。如果他们被继承了,你将难以检测一个属性是否实际上是在一个特定的类上,而不是它的任何超类。
如果您需要继承并且不想查看超类,那么使用类函数或类属性甚至标记接口(不声明方法)可能更有意义。那些是遗传的。
我使用窗体继承并具有控制这些窗体的单元测试的属性。我希望所有的子类/表单都被自动测试......现在我向上迭代类层次结构来查看这个属性是否存在。 – 2010-05-15 14:28:25
类函数是一个更好的解决方案 – 2011-04-24 13:25:31