涉及枚举类型的对象继承

Eri*_* S. 7 delphi delphi-2007

Delphi 2007,明年转向Delphi XE.

我们的产品广泛使用第三方组件.我们不直接使用该组件,而是使用它的自定义后代,我们已经添加了相当多的额外行为(自定义后代组件是几年前由已经退休的开发人员开发的).

在第三方Parent类的源单元中,声明了一些枚举类型,它们控制组件的各种操作:

TSpecialKind = (skAlpha, skBeta, skGamma);
TSpecialKinds = set of TSpecialKind;
Run Code Online (Sandbox Code Playgroud)

在我们的后代类中,我们想要添加新行为,这需要扩展枚举类型的选择.基本上,我们想要这个:

TSpecialKind = (skAlpha, skBeta, skGamma, skDelta, skEpsilon);
TSpecialKinds = set of TSpecialKind;
Run Code Online (Sandbox Code Playgroud)

显然,我们希望避免编辑第三方代码.简单地重新声明枚举类型,重复原始值并在我们自己的后代单元中添加新值是否有效?它会对现有代码产生任何影响吗?

编辑:示例场景(希望)澄清.假设您有一个(父)组件用于订购车辆零件.父单元具有用于车辆类型的枚举类型Tvkind,其值为vkCar和vkCycle.除其他外,这些值用于表示车辆有多少车轮,4或2.

现在,在您的后代组件中,您也希望能够处理三轮车辆.扩展Tvkind枚举类型以包含新值vkTrike似乎是一种显而易见的方法.但是,如果您无权访问或不想修改父组件代码,该怎么办?

Dav*_*nan 2

我不认为您可以合理地期望在不修改原始组件的情况下进行所需的更改。

让我们以您的车辆为例并进行更深入的研究。我希望原始组件会有这样的代码:

case Kind of
vkCar:
  CarMethod;
vkCycle:
  CycleMethod;
end;
Run Code Online (Sandbox Code Playgroud)

现在,假设您引入一个带有额外枚举的枚举类型

TExtendedVehicleKind = (vkCar, vkCycle, vkTrike);
Run Code Online (Sandbox Code Playgroud)

如果上面的 case 语句使用ExtendedKindequal to运行vkTrike,则不会调用任何方法。

现在,也许您想要的原始控件的行为可以通过设置KindtovkCarvkCyclewhen ExtendedKindis来实现vkTrike。但这对我来说似乎不太可能。只有您可以确定,因为只有您拥有代码,并且知道您的实际问题是什么。

  • 谢谢。这本质上是我期望的答案 - 不能或不应该在后代单元中“扩展”枚举类型。我们决定采取完全不同的方法。 (2认同)