2010-11-03 76 views
8

我正在阅读一些帖子,并注意到内部类的样本。我最近看到它很多,特别是在我浏览MSDN的几个例子中。我从来没有必须使用内部类(但也许我真的应该),所以我不知道究竟是什么意思?我假设一个内部类(至少是一个私有类)只对主类本身可用,所以将内部类的任何功能简单地结合到外部类的某些方法中是不是也一样?内部课堂背后有OO原因吗?内部类的目的是什么?

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

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

回答

6

如果内部类只涉及它们的包含(或外部)类,它们将非常有用。

私人内部类的一个很好的例子是当你需要管理外部类中永远不会被暴露的东西时。在下面的例子中,缓存管理器处理对象的缓存和非缓存。它使用私有的内部类来存储指向它想要缓存的对象的指针,以及它最后访问的时间。用户这个假想的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 
+0

那么在这个例子中,你将如何使用Node?当我认为公众的时候,我想我能以某种方式在树外访问它,情况如此,或者Node是公开的事实导致它重写另一个位于Tree之外的Node类? – pinkfloydx33 2010-11-03 12:32:19

+0

是的,因为它在树外,它可以作为“Tree :: Node”访问,从而确保你得到你想要的节点。任何其他阅读者都很清楚你的意思是哪个节点。 – 2010-11-03 12:39:18

+0

在Tree中,我假设你不必指定你想要Tree :: Node与SomeOtherNS :: Node? – pinkfloydx33 2010-11-03 12:45:41

3

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

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

也许外部类的职责不包括内部类的直接责任。所以创建内部类有助于维持高度凝聚力的类。

+0

个人我反对内部类 - 我宁愿投票给像从“朋友”关键字C++。 – 2010-11-03 11:28:24

相关问题