代码之家  ›  专栏  ›  技术社区  ›  pinkfloydx33

内部阶级的目的?

  •  10
  • pinkfloydx33  · 技术社区  · 14 年前

    我读了一些帖子,注意到里面有一个班的学生。最近我经常看到它,特别是在我浏览的几个关于msdn的例子中。我以前从未使用过内部类(但也许我真的应该如此),所以我想知道这到底有什么意义?我假设一个内部类(至少是一个私有类)只对主类本身可用,那么简单地将内部类所具有的任何功能合并到外部类的某些方法中,会不会是相同的呢?内在阶级背后有没有OO的原因?

    我主要在C中思考,但我认为这可以应用于任何支持内部类的OO语言。

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

    2 回复  |  直到 14 年前
        1
  •  9
  •   Moo-Juice    14 年前

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

    私有内部类的一个很好的例子是,当您需要管理外部类中永远不会公开的内容时。在下面的示例中,缓存管理器处理对象的缓存和取消缓存。它使用一个私有的内部类来存储指向它想要缓存的对象的指针,以及上次访问它的时间。此假设的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
    
        2
  •  4
  •   Vincent Ramdhanie    14 年前

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

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

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