首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举协变/多态性?

枚举协变/多态性?
EN

Stack Overflow用户
提问于 2017-07-19 20:52:04
回答 2查看 50关注 0票数 0

假设我有一个枚举定义了一个通用选项,如下所示:

代码语言:javascript
复制
enum valueState
{
   uninitialized,
   min,
   max
}

现在假设我对特定的值类型有一个更具体的值状态,假设:

代码语言:javascript
复制
enum floatValueState
{
   nan
}

是否有任何方法可以将valueState选项作为floatValueStates传递?或者,有没有其他方法可以在编译时实现这种选择的抽象,而不会有太多的模板噪声。

编辑: Ofc它们可以隐式地转换为枚举类型,但如何在没有重叠值的情况下组合两个枚举(如0=未初始化,4=无),而不指定我将组合多少枚举。

EN

回答 2

Stack Overflow用户

发布于 2017-07-19 20:55:34

因为旧式的enums (非类)只是整数(隐式转换),所以您可以传递它们,而不考虑您实际使用的是什么。这很危险,但可以让你轻松地做你想做的事情。不过,您需要对这些值进行微观管理,以确保nanuninitialized不是一回事:

代码语言:javascript
复制
enum floatValueState {
   nan = 3
}

任何接受floatValueState的东西都会隐式地接受ValueState,而不需要额外的工作--这是您想要的,但也是危险的。具体地说,任何接受ValueState的东西都会接受floatValueState --这可能会破坏一些东西。

票数 3
EN

Stack Overflow用户

发布于 2017-07-19 20:56:49

虽然在技术上可以解决这个问题(参见另一个答案),但存在一些理论问题:这可能违反了Liskov Substitution Principle。这个原则指导我们如何在合理的面向对象设计中使用继承。

它声明:“基本类型”的每个“用法”--你可以在那里插入“派生类型”。

在这种情况下,您将如何在这里“嵌入”“附加信息”?

换句话说(伪代码):

代码语言:javascript
复制
 valueState value = ...
 if (value == min || max) {
 ... } else {
   value must be uninitialized

但是如果value现在变成了floatValueState呢?!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45191204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档