Класс получает доступ к внутренним классам?

Class Outer
{
 ...
    private class Node
    {
      private T data;
      ...

      private T getData()
      {
         return data;
      }
    }
}

Какова цель использования методов set и get, если внешний класс может получить доступ к закрытым членам внутреннего класса? Какова цель сделать внутренние классы приватными? Доступ к пакету?


person ShrimpCrackers    schedule 09.05.2010    source источник
comment
Пожалуйста, отметьте вопрос, на каком языке вы используете.   -  person Donal Fellows    schedule 09.05.2010
comment
@Donal, похоже на Java.   -  person Jacob Relkin    schedule 09.05.2010
comment
Донал, это довольно независимый от языка вопрос... скорее общий вопрос ОО.   -  person Polaris878    schedule 09.05.2010
comment
@Jacob: я тоже так думал, но не мог исключить, что это что-то другое; исходный вопрос должен указать.   -  person Donal Fellows    schedule 09.05.2010
comment
Это специфичный для языка IS. В некоторых объектно-ориентированных языках нет концепции внутренних классов, а в других действуют другие правила для того, к чему они могут получить доступ или через что они могут быть доступны. Я добавил к этому тег Java, так как ОП говорит о пакетах.   -  person    schedule 09.05.2010
comment
Извините ребята. Я бы добавил тег Java, но, поскольку у меня здесь недостаточно представителей, я могу использовать только один тег. Итак, я использовал один, более специфичный для моей проблемы.   -  person ShrimpCrackers    schedule 10.05.2010


Ответы (3)


Частные внутренние классы пишутся, когда вы не хотите, чтобы класс подвергался воздействию внешних классов внутри или вне пакета. Они используются только внутри класса внешнего уровня.

Геттеры и сеттеры обычно не имеют смысла внутри частных классов, потому что вы все равно можете получить доступ к переменным экземпляра.

person Snehal    schedule 09.05.2010

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

Отредактировано для добавления: Ленивая загрузка — это когда вы создаете экземпляр члена только тогда, когда запрашиваются данные. Он используется, когда получение данных не всегда необходимо и требует больших затрат.

class a
{
private:
    int m_aNumber;
    bigDeal *m_pBig;

public:
    a() { m_aNumber = 0; m_pBig = NULL; }
    ~a() { if (m_pBig) delete m_pBig; }

    // trivial
    int get_aNumber() { return m_aNumber;}
    void set_aNumber(int val) { m_aNumber = val; }

    // lazy load
    bigDeal *get_Big()
    {
        if (m_pBig == NULL)
        {
            // bigDeal::bigDeal() downloads data from Mars Rover
            // takes 20 minutes, costs $1.2 million dollars to run
            m_pBig = new(bigDeal); 
        }
        return m_pBig;
    }
    void set_Big(bigDeal *val)
    {
        m_pBig = val;
    }
}
person egrunin    schedule 09.05.2010

Прежде всего, я бы посоветовал относиться к внутренним классам public/protected/internal так же, как к любому другому "внешнему" классу. То есть использовать те же принципы проектирования.

Что касается внутренних классов, когда я использую внутренние частные классы, они обычно заканчиваются просто кучей байтов... то есть они не выполняют фактическую обработку. Они нужны только для того, чтобы упростить написание кода для внешнего класса.

Я не призываю вас писать плохой код, но вы можете быть гораздо менее строгим в своем дизайне с внутренними частными классами. Как правило, они должны быть упрощенными и легковесными... не переусердствуйте с ООП во внутренних классах. Кроме того, если вам в конечном итоге придется что-то менять во внутреннем классе, вам нужно будет только обновить ссылки во внешнем классе... что TBH вообще не имеет большого значения.

person Polaris878    schedule 09.05.2010