3

我想到了这种模式,它允许使用基类作为其派生类的命名空间,如果事先知道所有派生类,这可能会很整洁。这看起来不错的一种情况是当您想为您的子类使用形容词时。这种模式有名字吗?

class Flag
{
public:
  class White;
  class Chequered;
  // ...
};

class Flag::White: public Flag
{
  // ...
};

class Flag::Chequered: public Flag
{
  // ...
};
4

2 回答 2

4

使用类作为命名空间是一种反模式。改为使用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

我不知道使用形容词命名类的做法的名称,但它看起来不错。短名称很好,::操作员总是会提供帮助。

于 2013-01-22T00:32:19.370 回答
2

它们被称为极其复杂的命名空间,实际上并没有使用关键字namespace

这个概念本身被称为Inner 类,在 Java 等一些语言中并不少见。

于 2013-01-22T00:33:18.497 回答