2010-11-03 75 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

相關問題