Какие причины были бы для гнездования классов - PullRequest
1 голос
/ 18 апреля 2009

Я гуглил в поисках преимуществ, которые можно было бы получить во вложенных классах. Есть много примеров того, как это сделать, но я не могу найти причин для объявления одного класса в другом. Я даже проконсультировался со своим недавно прибывшим «Кодексом завершенным», но там также не было упоминания. Я вижу недостаток в том, что его труднее читать.

Ответы [ 6 ]

11 голосов
/ 18 апреля 2009

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

Семантически, нет никакой разницы для отдельного класса, но вложение посылает ясное сообщение, что класс не должен использоваться сам по себе.

2 голосов
/ 18 апреля 2009

Есть несколько проектных решений, которые заканчиваются созданием вложенного класса:

  • Вы хотите сделать более явным отношение между двумя классами; а. имя более явно, чем два класса в одном пространстве имен
  • контекстно-зависимые классы как вложенные классы верхнего уровня, заключенные в контекст-обслуживающий класс, делают эту зависимость более понятной "эти вещи идут вместе"
  • избегает загрязнения пространства имен
  • уменьшает количество исходных файлов

так что за вложенными классами стоят два принципа: зависимость и лучшая организация

0 голосов
/ 18 апреля 2009

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

Общий шаблон для вложенного класса для реализации открытого интерфейса, а для внешнего класса - для представления экземпляра вложенного класса через метод, тип возвращаемого значения которого является открытым интерфейсом. Шаблон итератора является одним из примеров этого.

0 голосов
/ 18 апреля 2009

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

0 голосов
/ 18 апреля 2009

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

0 голосов
/ 18 апреля 2009

Используйте их, если родительскому классу нужны некоторые модели для работы, но не все другие классы. Таким образом, внутреннее представление / помощник для некоторых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...