我已经想到了这种模式允许使用基类作为其衍生物的命名空间,如果事先知道所有衍生物,这可能很简洁。这种情况看起来不错的一种情况是当你想为你的子类使用形容词时。这种模式有名字吗?
class Flag
{
public:
class White;
class Chequered;
// ...
};
class Flag::White: public Flag
{
// ...
};
class Flag::Chequered: public Flag
{
// ...
};
答案 0 :(得分:4)
使用类作为命名空间是一种反模式。请改用namespace
。
嵌套类不能成为using
声明的主题,因此如果没有typedef
,您将别无选择,只能引用Flag::Chequered
而不是Chequered
在客户端代码中。正如您所提到的,所有衍生品必须事先知道。如果没有class Flag
的定义,则无法向前声明它们。简单地包含namespace
就可以让您将std::relops
中的运算符应用到类集群中。
美学永远不会弥补语言滥用。这是另一种选择:
namespace flags {
class Base;
class White;
class Chequered;
}
typedef flags::Base Flag; // independent concept goes into enclosing namespace
我不知道使用形容词来命名类的实践名称,但它看起来不错。短名称很好,::
运算符总是有帮助。
答案 1 :(得分:2)
它们被称为极其复杂的命名空间,而没有实际使用关键字namespace
。
虽然这个概念本身被称为Inner class,但在Java等某些语言中并不罕见。