假设我想覆盖某个已在某处定义的类,例如,让我们说System.Classes.TOriginalClass
,我想保留原始的类名。我知道我必须这样定义:
type
TOriginalClass = class(System.Classes.TOriginalClass)
...
end;
如果我想在声明它的同一单元中实现这个自定义重写类,我没有任何问题,只要我想要它使用的每个地方都在我声明这个类的下面。
但是假设我想在另一个单元中使用这个替换类。 System.Classes
是一个非常常见的单位,几乎用于我的每一个单位。我希望能够同时使用System.Classes
单元以及创建此重写版本的单元,我们称之为MyClasses
。
我知道在任何其他单位中,我可以通过在声明中包含完整的单位/类来实现这一点,如下所示:
type
TMyClass = class(MyClasses.TOriginalClass)
...
end;
但是,这几乎会破坏整个目的,因为我将被迫在MyClasses.
之前包含TOriginalClass
作为前缀。我想做的是不必担心最初宣布TOriginalClass
的地方,并宣布它是这样的......
type
TMyClass = class(TOriginalClass)
...
end;
...同时确保TMyClass
将继承自MyClasses.TOriginalClass
而不是System.Classes.TOriginalClass
。
我很确定这将包含我在uses子句中声明这两个单元中的每一个的顺序,例如,在使用System.Classes
之前使用MyClasses
。但这应该是可能的吗?这样做时我应该注意什么?
PS - TOriginalClass
我知道这不是一个真正的类,我用它来演示最初在System.Classes
中声明的任何类。同样适用于任何单位的任何原始类别。
答案 0 :(得分:5)
你已经给出了答案。
是的,您可以仅MyClasses.TOriginalClass
指定TOriginalClass
,但要求MyClasses
列表中的uses
晚于System.Classes
,或者完全从System.Classes
列表中省略uses
。对不起,别无他法。
如果您没有限定TOriginalClass
,编译器将使用它遇到的“最后”声明。它不会自动使用派生最多的一个。
对不起。