嵌套类是否有用例?

Len*_*bro 3 c++ ruby python oop

我最近看到有几个人在Stackoverflow上做这样的事情:

class A:
    foo = 1

    class B:
        def blah(self):
            pass
Run Code Online (Sandbox Code Playgroud)

换句话说,他们有嵌套类.这是有效的(虽然Python新手似乎遇到了问题,因为它的行为并不像他们想象的那样),但我想不出任何理由在任何语言中都这样做,当然也不是在Python中.有这样的用例吗?为什么人们这样做?搜索它似乎在C++中相当普遍,有充分的理由吗?

Ser*_*nov 6

将一个类放在另一个类中的主要原因是避免使用仅在一个类中使用的内容来污染全局名称空间,因此不属于全局名称空间.这甚至适用于Python,全局命名空间是特定模块的命名空间.例如,如果您有SomeClass和OtherClass,并且它们都需要以专门的方式读取内容,那么最好使用SomeClass.Reader和OtherClass.Reader而不是SomeClassReader和OtherClassReader.

不过,我从未在C++中遇到过这种情况.从嵌套类控制对外部类字段的访问可能会有问题.在头文件中定义的编译单元中只有一个公共类以及CPP文件中定义的一些实用程序类(Qt库就是一个很好的例子)也很常见.这样它们对于"外人"是不可见的,这是好的,所以将它们包含在标题中没有多大意义.它还有助于增加二进制兼容性,否则这是一个难以维护的问题.嗯,无论如何,这是一种痛苦,但更不用说了.

嵌套类非常有用的语言的一个很好的例子是Java.嵌套类自动有一个指向创建它们的外部类的实例的指针(除非您将内部类声明为静态).这样您就不需要将"外部"传递给它们的构造函数,只需按名称来解析外部类的字段.


Pup*_*ppy 4

它允许您控制嵌套类的访问 - 例如,它通常用于实现细节类。在 C++ 中,它在解析各种事物的时间以及无需先声明即可访问的内容方面也具有优势。

  • 我不认为私人会员资格是一个障碍。容器类的用户不应该能够访问诸如“std::map<K,V>::rb_node”之类的内容。 (3认同)
  • @Lennart:有一个你完全没有考虑的原因:例如,拥有一个私有方法,允许你在编译它时非常积极地内联它。禁止您调用私有成员或字段的一个非常好的理由是,根据编译过程的激进程度,它们实际上可能**不存在**。 (2认同)