我可以继承一个具有相同名称的类,并在没有单位前缀的其他单元中自由使用它吗?

时间:2012-07-07 01:13:43

标签: delphi class inheritance override delphi-xe2

假设我想覆盖某个已在某处定义的类,例如,让我们说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中声明的任何类。同样适用于任何单位的任何原始类别。

1 个答案:

答案 0 :(得分:5)

你已经给出了答案。

是的,您可以仅MyClasses.TOriginalClass指定TOriginalClass,但要求MyClasses列表中的uses晚于System.Classes,或者完全从System.Classes列表中省略uses。对不起,别无他法。

如果您没有限定TOriginalClass,编译器将使用它遇到的“最后”声明。它不会自动使用派生最多的一个。

对不起。