2010-11-03 13 views
8

Stavo leggendo alcuni post e ho notato dei campioni con una classe interiore. L'ho visto molto ultimamente, in particolare in alcuni esempi su MSDN che stavo sfogliando. Non ho mai dovuto usare una classe interiore prima (ma forse dovrei davvero esserlo) quindi mi chiedo quale sia esattamente il punto? Suppongo che una classe interiore (almeno una privata) sia disponibile solo per la classe principale stessa, quindi non sarebbe lo stesso semplicemente incorporare qualsiasi funzionalità della classe interna in alcuni metodi della classe esterna? C'è una ragione OO dietro la classe interiore?Scopo di una classe interiore?

Sto pensando principalmente a C#, ma suppongo che questo possa applicarsi a qualsiasi linguaggio OO che supporti una classe interna.

Prendere this sample on msdn ad esempio: CharacterCollection e WordCollection sono classi pubbliche all'interno della classe Documento. Che differenza ci sarebbe se questi fossero al di fuori della classe Documento?

risposta

6

Le classi interne sono molto utili se riguardano solo la loro classe di contenimento (o, esterna).

Un buon esempio di classe interna privata è quando è necessario gestire qualcosa all'interno della classe esterna che non sarà mai esposto. Nell'esempio seguente, un gestore cache gestisce la memorizzazione nella cache e lo sganciamento degli oggetti. Utilizza una classe interna privata per memorizzare il puntatore su un oggetto che desidera memorizzare nella cache e anche l'ora in cui è stato effettuato l'ultimo accesso. Codice che gli utenti di questo ipotetico CacheManager non devono mai sapere di 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 

Quindi arriva il caso di una classe interna pubblica. Vorrei usare una classe annidata se il nome (che vorrei mantenere semplice), il mio conflitto altrove:

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

Quindi, in questo esempio, come utilizzeresti il ​​nodo? Quando penso che sia pubblico, immagino che in qualche modo ho accesso ad esso al di fuori di Tree, sarebbe il caso o il fatto che il nodo sia pubblico in qualche modo lo induca a scavalcare un'altra classe di Nodo che si trova all'esterno di Tree? – pinkfloydx33

+0

Sì, poiché è esterno all'albero, è accessibile come "Albero :: Nodo", assicurando in tal modo che stai ricevendo il Nodo desiderato. È anche chiaro a tutti gli altri lettori del codice che Node intendi. –

+0

All'interno di Tree quindi presumo che non sia necessario specificare che si desidera Tree :: Node versus SomeOtherNS :: Node? – pinkfloydx33

3

Una ragione è che le classi interne hanno accesso direttamente ai membri della classe che li include. Non hanno bisogno di un riferimento alla classe che chiude per accedere a quei membri. Allo stesso tempo, altri oggetti potrebbero aver bisogno di accedere all'oggetto interno.

Posso pensare all'esempio di iteratori che sono dichiarati come classi interne nelle raccolte. L'iteratore deve avere una conoscenza approfondita della raccolta che itera ma il codice client ha bisogno di accedere all'iteratore stesso come oggetto. Non è possibile utilizzare la funzionalità dell'iteratore e includerla nella classe esterna.

Forse le responsabilità della classe esterna non includono direttamente quelle della classe interna. Quindi creare la classe interiore aiuta a mantenere classi molto coese.

+0

Personalmente sono contro le classi interne - avrei preferito votare per qualcosa come "amico" parola chiave da C++. –

Problemi correlati