我正在阅读一些帖子并注意到内部课程的样本。我最近看到了很多,特别是在我浏览的MSDN上的几个例子中。我以前从来没有使用内部类(但也许我真的应该这样)所以我想知道究竟是什么意思?我假设一个内部类(至少是一个私有的)只能用于主类本身,所以将内部类的任何功能简单地合并到外部类的某些方法中是不是一样的?内部阶级背后有一个OO理由吗?
我主要在C#中思考,但我认为这适用于任何支持内部类的OO语言。
以this sample on msdn为例:CharacterCollection和WordCollection是Document类中的公共类。如果这些不在Document类之外会有什么区别?
答案 0 :(得分:9)
如果内部类仅与其包含(或外部)类相关,则它们非常有用。
私有内部类的一个很好的例子是当你需要在外部类中管理永远不会暴露的东西时。在下面的示例中,缓存管理器处理对象的缓存和卸载。它使用私有内部类来存储指向它想要缓存的对象的指针,以及它上次访问的时间。用户这个假设的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
答案 1 :(得分:4)
一个原因是内部类可以直接访问封闭类的成员。他们不需要引用封闭类来访问这些成员。同时,其他对象可能需要访问内部对象。
我可以想到在集合中声明为内部类的迭代器的示例。迭代器需要熟悉它迭代的集合,但客户端代码需要访问迭代器本身作为对象。您不能使用迭代器的功能并将其包含在外部类中。
也许外层类的职责不直接包含内部类的职责。因此,创建内部类有助于保持高度内聚的类。