继承只是为了共享枚举——危险吗?
inheritance just to share enum - dangerous?
每当我想在多个文件中共享一个枚举时,我会:-
- 创建一个 class 例如
B
专用于枚举
- a class,想要轻松访问枚举,将派生自
B
大多数情况下,一个枚举会有一个 class。 (1:1)
class B{
public: enum EnumB{ E1,E2 };
};
class C : public B{ /* .... access EnumB */}; //a kind of struct
class D : public B{ /* .... access EnumB */}; //a kind of widget/manager
此方法使 C
和 D
无需任何前缀 B
即可访问 EnumB
。
我认为还可以,因为我在非常狭窄的范围内使用这些枚举。 (2-4 classes)
A SO post 还声明可以将继承用于实用程序。
但是,我不认为这是一种流行的方法:-
a SO-qualified way to share enum.
Share global enum inside a namespace
问题
我的方法怎么危险?它的缺点是什么?
在实际情况下,我倾向于多重继承许多 classes 就是为了这个。
class ShadowEnum{ public: enum ShadowE{ SHADOW,NO_SHADOW}; };
class ColorEnum{ public: enum ColorE{ RED,BLUE,GREEN,PURPLE } };
class LightType{ public: enum LightE{ L_SPHERE, L_CONE, L_SPOT}; };
class LightManager : public ShadowEnum, public ColorEnum,public LightType{
/* some code */
};
这会不会成为未来可怕钻石问题的原因?
顺便说一句,我认为enum-class不在本题范围内。
不是"dangerous"per-se。这只是糟糕的设计。
Class 继承应该定义 IS-A 关系。
从非 "natural" 的东西继承时,您往往会在以后的开发道路上遇到问题。
一些可能影响您的设计含义是:
1.同一个class在更深的继承图中的多重继承
2. 如果您将来更改继承结构,指针转换可能会受到影响(为了方便继承,您不希望发生这种情况)
几个更好的解决方案:
1. 在命名空间中包含枚举 - 使用 #using namespace。在 header 中添加它会传播到任何包含 header.
的编译单元
2. 在 C++11 中你可以只使用 enum classes - 不是在继承中,但它给你更强的类型安全性。
每当我想在多个文件中共享一个枚举时,我会:-
- 创建一个 class 例如
B
专用于枚举 - a class,想要轻松访问枚举,将派生自
B
大多数情况下,一个枚举会有一个 class。 (1:1)
class B{
public: enum EnumB{ E1,E2 };
};
class C : public B{ /* .... access EnumB */}; //a kind of struct
class D : public B{ /* .... access EnumB */}; //a kind of widget/manager
此方法使 C
和 D
无需任何前缀 B
即可访问 EnumB
。
我认为还可以,因为我在非常狭窄的范围内使用这些枚举。 (2-4 classes)
A SO post 还声明可以将继承用于实用程序。
但是,我不认为这是一种流行的方法:-
a SO-qualified way to share enum.
Share global enum inside a namespace
问题
我的方法怎么危险?它的缺点是什么?
在实际情况下,我倾向于多重继承许多 classes 就是为了这个。
class ShadowEnum{ public: enum ShadowE{ SHADOW,NO_SHADOW}; }; class ColorEnum{ public: enum ColorE{ RED,BLUE,GREEN,PURPLE } }; class LightType{ public: enum LightE{ L_SPHERE, L_CONE, L_SPOT}; }; class LightManager : public ShadowEnum, public ColorEnum,public LightType{ /* some code */ };
这会不会成为未来可怕钻石问题的原因?
顺便说一句,我认为enum-class不在本题范围内。
不是"dangerous"per-se。这只是糟糕的设计。
Class 继承应该定义 IS-A 关系。
从非 "natural" 的东西继承时,您往往会在以后的开发道路上遇到问题。
一些可能影响您的设计含义是:
1.同一个class在更深的继承图中的多重继承
2. 如果您将来更改继承结构,指针转换可能会受到影响(为了方便继承,您不希望发生这种情况)
几个更好的解决方案:
1. 在命名空间中包含枚举 - 使用 #using namespace。在 header 中添加它会传播到任何包含 header.
的编译单元
2. 在 C++11 中你可以只使用 enum classes - 不是在继承中,但它给你更强的类型安全性。