我想到了这种模式,它允许使用基类作为其派生类的命名空间,如果事先知道所有派生类,这可能会很整洁。这看起来不错的一种情况是当您想为您的子类使用形容词时。这种模式有名字吗?
class Flag
{
public:
class White;
class Chequered;
// ...
};
class Flag::White: public Flag
{
// ...
};
class Flag::Chequered: public Flag
{
// ...
};
我想到了这种模式,它允许使用基类作为其派生类的命名空间,如果事先知道所有派生类,这可能会很整洁。这看起来不错的一种情况是当您想为您的子类使用形容词时。这种模式有名字吗?
class Flag
{
public:
class White;
class Chequered;
// ...
};
class Flag::White: public Flag
{
// ...
};
class Flag::Chequered: public Flag
{
// ...
};
使用类作为命名空间是一种反模式。改为使用namespace
。
嵌套类不能作为using
声明的主题,因此如果没有 a,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
我不知道使用形容词命名类的做法的名称,但它看起来不错。短名称很好,::
操作员总是会提供帮助。
它们被称为极其复杂的命名空间,实际上并没有使用关键字namespace
。
这个概念本身被称为Inner 类,在 Java 等一些语言中并不少见。