是我还是 C++ 中面向对象范式的实现缺少类命名空间的概念?
这是我的意思的一个例子:
文档{页眉{}正文{}页脚{}}
Document 是一个可以有页眉、正文和页脚的对象。
从外部命名空间处理此类对象及其元素的直接方法是
- 文档
- 文档::标题
- 文档::正文
- 文档::页脚
有没有办法在 C++ 中实现这样的命名结构而不限制 Document 类的定义?
1) 命名空间文档 { ... }
这种情况需要在其自己的命名空间内有一个对象类,并且使用 Document::Document 似乎是多余的和无意的。
2) 命名空间 Document { class ... } typedef Document::Document 文档;
这种情况下给出了 document 和 Document::{part},在区分大小写的情况下,它们可能看起来很奇怪且不相关。
3)类文档{类...};
这种情况需要在每个嵌套类的定义中包含 Document 标头,并且不允许使最终对象成为其部分的派生对象,因为它们是在其自己的范围内定义的。
4)类文档{类...};类文档:公共文档{}
这种情况接近预期,但需要额外的类和继承。
!)理想情况下,我想要的是
namespace class Document {
class Header;
class Body;
class Footer;
class Document; // linked with the parent namespace as with its own name space
}
Document doc; // ok, resolves Document as a class
Document::{Part} docPart; // ok, resolves Document as namespace
.) 是否有任何其他合理的方式来实现预期目标而无需不合理的额外费用?
我也不完全确定为什么这些琐碎的事情不是标准的方法。:/ 有什么具体原因吗?
--- 澄清 ---
为了解决一些提出的问题,
“有什么用?” 1) 普通语言 2) 从语言结构到对象抽象模型的透明映射,反之亦然。
“为什么要从它的各个部分派生出一个对象?” 并非一个对象引入的每个实体都必须是它的一部分。例如,它可以是它的本质。例如:
文档 { Skeleton{} Parts { Header {} Body {} Footer {} } }
--- 抽象框架 ---
将对象视为一个模块,它的定义可以使用外部符号并引入它自己的一些符号以及它自己的逻辑实体的定义,因为它引入了它们,所以它们应该保持相关。
- - 观点 - -
整个模块是一个对象的定义。如果能够在没有任何额外的语言嘲笑的情况下使用它,那就太好了。
=== 分辨率 ===
感谢您的反馈意见。
在 C++ 中有一种方法可以将命名空间名称链接到类之前,我想我会使用
ObjectName { ... Object {} } -> ObjectName ::对象,ObjectName :: Part
在这种情况下构建。它可能没有我想的那么短,但至少足够透明,没有额外的成本,并且可以与前向声明一起使用。