【问题标题】:Purpose of an Inner Class?内部课程的目的?
【发布时间】:2011-05-04 10:32:25
【问题描述】:

我正在阅读一些帖子并注意到带有内部类的示例。我最近经常看到它,尤其是在我浏览的 MSDN 上的一些示例中。我以前从未使用过内部类(但也许我真的应该使用)所以我想知道这到底是什么意思?我假设一个内部类(至少是一个私有的)只对主类本身可用,那么简单地将内部类具有的任何功能合并到外部类的某些方法中不是一样的吗?内部类背后有OO原因吗?

我主要在 C# 中思考,但我想这可能适用于任何支持内部类的 OO 语言。

this sample on msdn 为例:CharacterCollection 和 WordCollection 是 Document 类中的公共类。如果这些在 Document 类之外会有什么区别?

【问题讨论】:

    标签: oop inner-classes


    【解决方案1】:

    如果内部类仅与它们的包含(或外部)类相关,则它们非常有用。

    私有内部类的一个很好的例子是当您需要在外部类中管理永远不会暴露的东西时。在下面的示例中,缓存管理器处理对象的缓存和取消缓存。它使用私有内部类来存储指向它想要缓存的对象的指针,以及它最后一次访问的时间。用户这个假设的 CacheManager 不需要知道 CacheEntry 的代码。

    class CacheManager
    {
    private:
        class CacheEntry
        {
        private:
            Object* m_pObjectToCache;
            int     m_nTicksSinceTouched;
        }; // eo class CacheEntry
        std::map<int, CacheEntry*> m_Cache;
    
    public:
        Object* getObject(int _id);
    }; // eo class CacheManager
    

    然后是公共内部类的情况。如果名称(我想保持简单),我会在其他地方发生冲突,我会使用嵌套类:

    class Tree
    {
    public:
        // public class.. Node might pertain to anything in the code, let's keep it simple
        // and clear that THIS Node belongs and works with THIS Tree class.
        class Node
        {
        };// eo class Node
    }; // eo class Tree
    

    【讨论】:

    • 那么在这个例子中,你将如何使用 Node?当我认为它是公共的时,我想我以某种方式可以在 Tree 之外访问它,是这种情况还是 Node 是公共的事实会以某种方式导致它覆盖位于 Tree 之外的另一个 Node 类?跨度>
    • 是的,因为它在树之外,它可以作为“Tree::Node”访问,从而确保您获得所需的节点。代码的任何其他读者也很清楚您指的是哪个节点。
    • Within Tree 那么我假设您不必指定您想要 Tree::Node 与 SomeOtherNS::Node?​​span>
    • 正确,感谢范围规则。在“Tree”类的方法中,“Node”(如所写)将引用“Tree::Node”。
    【解决方案2】:

    一个原因是内部类可以直接访问封闭类的成员。他们不需要引用封闭类来访问这些成员。同时其他对象可能需要访问内部对象。

    我可以想到在集合中声明为内部类的迭代器的示例。迭代器需要对其迭代的集合有深入的了解,但客户端代码需要将迭代器本身作为对象访问。您不能使用迭代器的功能并将其包含在外部类中。

    也许外部类的职责不直接包括内部类的职责。因此,创建内部类有助于维护高度内聚的类。

    【讨论】:

    • 就我个人而言,我反对内部类——我宁愿为 C++ 中的“朋友”关键字投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2022-01-25
    • 1970-01-01
    • 2012-03-02
    • 2019-05-26
    • 2012-02-25
    • 2021-02-27
    相关资源
    最近更新 更多