【问题标题】:How to extend an enumeration type?如何扩展枚举类型?
【发布时间】:2019-12-12 11:02:46
【问题描述】:

我经常需要给一些第三方枚举类型加上一个“默认值”,例如:

  TThirdPartyEnum = (
    eA,
    eB,
    eC
  );

我想定义一个这样的枚举类型:

TMyEnum = (
  eA,
  eB,
  eC,
  eDefault
);

我想参考TThirdPartyEnum 值以避免维护TMyEnum(应在每次TThirdPartyEnum 值更改时更新)。

我尝试如下失败:

  TMyEnum = Low(TThirdPartyEnum)..High(TThirdPartyEnum) + eDefault;

  TMyEnum = (
    Low(TThirdPartyEnum)..High(TThirdPartyEnum),
    eDefault
  );

有没有编译器可以理解的语法?

【问题讨论】:

  • AFAIK,枚举不可继承(不完全是,你正在尝试,但值得一提)
  • 只是好奇为什么不用Low(TThirdPartyEnum)..High(TThirdPartyEnum), 而不是eA..High(TThirdPartyEnum),。如果 eA 从第三方枚举中删除会怎样。
  • 还是搬到了更高的地方?喜欢(e0, e1, eA, eB, eC)
  • @NasreddineGalfout:你说得对,我已经更新了问题
  • 将默认值作为枚举的最后一个成员似乎不是最好的主意,原因有很多。其中之一是Default(TMyEnum) 返回等于零的成员,可能是枚举的第一个成员,而不是eDefault。也许你可以用泛型解决你的问题 - Nullable<T>。另请参阅this C# question 和 Eric Lippert 关于默认枚举值的精彩回答。

标签: delphi enums delphi-xe7


【解决方案1】:

您不能扩展枚举类型。

您将需要一种不同的方法来解决您的问题,可能是通过声明一个新的枚举类型并编写辅助方法来在它们之间进行映射。您可以使用记录助手的隐式强制转换运算符来使代码更具可读性,但这可能比任务所证明的更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多