Цель внутреннего класса? - PullRequest
10 голосов
/ 03 ноября 2010

Я читал несколько постов и заметил образцы с внутренним классом.В последнее время я часто видел это, особенно в нескольких примерах по MSDN, которые просматривал.Раньше мне никогда не приходилось использовать внутренний класс (но, может быть, так и должно быть), поэтому мне интересно, в чем именно смысл?Я предполагаю, что внутренний класс (по крайней мере, частный в любом случае) доступен только самому главному классу, поэтому не будет ли это то же самое, что просто включить какую-либо функциональность внутреннего класса в некоторые методы внешнего класса?Есть ли OO причина за внутренним классом?

Я думаю, в основном, на C #, но я полагаю, что это может относиться к любому языку OO, который поддерживает внутренний класс.: CharacterCollection и WordCollection являются открытыми классами внутри класса Document.Какая разница была бы, если бы они были вне класса Document?

Ответы [ 2 ]

9 голосов
/ 03 ноября 2010

Внутренние классы очень полезны, если они относятся только к их содержащему (или внешнему) классу.

Хороший пример частного внутреннего класса - это когда вам нужно управлять чем-то внутри внешнего класса, которое никогда не будет выставлено. В приведенном ниже примере менеджер кэширования обрабатывает и кэширует объекты. Он использует закрытый внутренний класс для хранения указателя на объект, который он хочет кешировать, а также времени последнего обращения к нему. Код, который использует этот гипотетический 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
4 голосов
/ 03 ноября 2010

Одна из причин заключается в том, что внутренние классы имеют доступ к членам включающего класса напрямую.Им не нужна ссылка на включающий класс, чтобы получить доступ к этим членам.В то же время другим объектам может потребоваться доступ к внутреннему объекту.

Я могу вспомнить пример Итераторов, которые объявлены как внутренние классы в коллекциях.Итератор должен иметь глубокие знания о коллекции, которую он итерирует, но клиентскому коду необходим доступ к самому итератору как к объекту.Вы не можете взять функциональность итератора и включить его во внешний класс.

Может быть, обязанности внешнего класса не включают в себя обязанности внутреннего класса напрямую.Таким образом, создание внутреннего класса помогает поддерживать очень сплоченные классы.

...