gpt4 book ai didi

delphi - 涉及枚举类型的对象继承

转载 作者:行者123 更新时间:2023-12-03 14:54:01 26 4
gpt4 key购买 nike

Delphi 2007,明年迁移到 Delphi XE。

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

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

TSpecialKind = (skAlpha, skBeta, skGamma);
TSpecialKinds = set of TSpecialKind;

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

TSpecialKind = (skAlpha, skBeta, skGamma, skDelta, skEpsilon);
TSpecialKinds = set of TSpecialKind;

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

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

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

最佳答案

枚举类型的继承与类的继承方式不同,因为代码对枚举做出的假设永远不会对类做出。例如,给定您的原始枚举(TSpecialKind),第三方组件可能包含如下代码:

var Something: TSpecialKind;
[...]
case Something of
skAlpha: ;
skBeta: ;
skGamma: ;
end;

即使您可以将不属于该枚举的内容转换为 TSpecialKind 类型,上面代码的结果也将是未定义(而且绝对不好!)

枚举可能以另一种方式使用,如果第三方组件仅以这种方式使用它,那么您可能可以做一些“巫术”,但我不推荐它。如果原始的TSpecialKind仅通过其TSpecialKinds集合类型使用,那么它只能像这样使用:

if skBeta in VarOfTypeSpecialKinds then
begin
...
end;

(续)那么您可以引入一种新类型,以相同的顺序、相同的值枚举所有原始值。如果执行此操作后 SizeOf(TSpecialKind) 等于 SizeOf(TNewType) 那么您可以将新的 set 值硬转换为旧值,然后旧代码的工作原理是一样的。但坦率地说,这是很hacky的,在很多条件下它都无法正常工作,太脆弱了。更好的解决方案是使用仅在您的后代组件中使用的新枚举类型:

type TExtraSpecialKind = (skDelta, skEpsilon);
TExtraSpecialKinds = set of TExtraSpecialKind;

您可能会在不同的媒体资源中发布此集合;该解决方案很干净,可以与后代代码很好地混合,并且也可以干净地使用。示例:

if (skAlpha in SpecialKind) or (skDelta in ExtraSpecialKind) then
begin
// Do extra-sepcial mixed stuff here.
end;

关于delphi - 涉及枚举类型的对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14648395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com