7

В open-source проекте не раз встречаю объявление классов внутри другого класса. Почему программисты поступают так? Ведь можно просто создать папку в решении (расширить пространство имен) и добавить туда необходимые файлы с классами и структурами.

Пример такого объявления:

public class ClassContainer
{
    public const double SomeValue = 10;

    public class Foo { }
    public class Bar { }

    // ...
}

Может быть, существуют свои преимущества данного подхода?

UPD. Я, кажется, узнал причину, почему классы находятся внутри других классов. Дело в том, что часть проекта была сгенерирована из файлов исходного кода языка с++ с помощью специального генератора кода, написанного на Python. Скорее всего, по этой причине классы обернуты еще одним классом.

2 Answers2

6
  1. Вложенные классы имеют доступ к скрытым от внешнего мира членам класса уровня выше.
  2. Можно спрятать какую-нибудь структуру внутри класса, если работа с ней снаружи не подразумевается и тогда эта структура не будет маячить в подсказках.

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

iluxa1810
  • 24,899
  • 1
    А как насчет protected полей? Ну и не только полей, но и свойств, методов, событий, конструкторов, индексаторов... в общем членов родительского типа. – tym32167 Jun 07 '19 at 07:10
  • @tym32167 подправил. – iluxa1810 Jun 07 '19 at 07:11
  • По поводу второго пункта, я как то писал пример, когда вложенный тип нужен для внутренней реализации класса, может автору будет полезно. – tym32167 Jun 07 '19 at 07:14
  • Еще пример, где вложенные типы реализуют публичный интерфейс. – tym32167 Jun 07 '19 at 07:17
  • Второй пункт - неплохое преимущество. Но вот в моем примере (как и в open-source проекте, который я сейчас разбираю) вложенные классы с модификатором public. Как я понимаю, это удобный для конкретного программиста вариант работы с пространствами имен через класс. – Andrei Khotko Jun 07 '19 at 07:25
4

Почему программисты поступают так?

Сразу пример в виде структуры List<T>.Enumerator. Вообще говоря, описание структуры внутри класса - вполне логичное решение при желании показать логическую связанность класса и структуры. С другой стороны - объявление private/protected классов или структур технически невозможно напрямую в пространствах имён, поэтому приходится оборачивать их во что-нибудь (например, класс).