我使用属性并假设它们是继承的,但似乎并非如此:
type
[MyAttribute]
TClass1 = class
end;
TClass2 = class(TClass1)
end;
TClass2没有属性“MyAttribute”,尽管它继承自Class1。是否有可能使属性可继承?或者我是否必须上升类层次结构并搜索属性?
答案 0 :(得分:3)
属性是类或其他符号的装饰,例如方法。属性修饰声明,但不是类的功能。因此,不会继承属性。
是的,您可以在类层次结构中查找属性,但有更好的解决方案。使用空接口(IMyInterface = Interface)作为“标记”接口。接口实现类的所有后代也将是该接口的实现者。您需要确保的是,您的基类实现了IInterface,如果您的基类来自TInterfacedObject或TComponent,则已经是这种情况。
完成此操作后,您可以使用Supports函数来测试该类或其祖先之一是否实现了该接口。
答案 1 :(得分:0)
我从未在Delphi中使用过属性 - 所以这个答案有点猜测。但我知道Java中的注释基本上是相同的。
但是如果它们不被继承则有意义:子类可能需要其他属性,或者与超类的属性相矛盾。此外,如果属性未被继承,则如果“您的”属性usecase需要,则您有机会遵循层次结构。如果它们是继承的,那么您将难以检测属性是否实际上在特定类上,而不是其任何超类。
如果你需要继承并且不想查看超类,那么使用类函数,类属性甚至标记接口(声明没有方法)可能更有意义。这些都是遗传的。