Я не пытаюсь сказать, что знаю что-то, чего не знают все остальные, но я решаю все больше и больше проектов с использованием вложенных классов, поэтому мне любопытно почувствовать приемлемость использования этого, казалось бы, редко используемого механизм проектирования.
Это приводит меня к вопросу: иду ли я по изначально плохому пути по причинам, которые я обнаружу, когда они вернутся, чтобы укусить меня, или вложенные классы могут быть чем-то недооцененным?
Вот два примера, для которых я только что использовал их: https://gist.github.com/3975581 - первый помог мне сохранить вместе тесно сплетенные иерархические вещи, второй позволил мне предоставить доступ к защищенным членам для рабочих ...
Ответы:
Я бы не назвал это «редко используемым механизмом проектирования» - по крайней мере, не универсально: хотя есть магазины, в которых некоторые участники могут нахмуриться, используя вложенные классы, это вовсе не неясная функция.
Хотя наличие классов с видимостью сборки и введение лямбда-выражений значительно сократило потребность во вложенных классах * , они остаются допустимым выбором дизайна. Хотя внутренние пространства внутри пространства имен частично перекрываются, функция вложенных классов уникальна, поскольку позволяет полностью скрыть класс внутри другого класса.
* Использование аналогичной функции в Java намного выше, потому что других альтернатив, доступных в C #, в Java нет.
источник
Подумайте на минуту, что вы пишете класс внутри другого класса, который никогда не будет использоваться где-либо еще в вашей программе. Потому что, если бы вы использовали его в другом месте, вы бы сделали его обычным публичным классом, как и все остальные.
Так что то, что должно сделать ООП великим (возможность повторного использования), здесь отсутствует. Кроме того, чего вы можете достичь с помощью вложенного класса, чего не можете достичь с помощью обычных методов и закрытых членов родительского класса?
Для полезного программного шаблона, использующего вложенные классы, посмотрите здесь .
источник
am I going down an inherintly bad path
Я думаю, что в вашем втором примере (рабочие подклассы) вы определенно. Вы сопоставили каждый подкласс с определенным состоянием в суперклассе. Поэтому теперь каждый раз, когда вы хотите добавить состояние в суперкласс, вам нужно будет внести изменения в три местоположения (добавить состояние в суперкласс, добавить новый подкласс и изменить конструктор производного класса, чтобы добавить подкласс в список ).
Использование вложенных классов для доступа к закрытым членам действительно представляется допустимым (я никогда не делал этого лично), но ваш конкретный случай здесь не работает.
Что касается примера части тела. Поскольку все вложенные классы являются общедоступными, на самом деле вы мало что делаете, кроме пространства имен. Если эти классы расширяются и включают больше функциональности, вы можете просто обнаружить, что вложенные классы просто загромождают интерфейсы, и вы просматриваете код, чтобы найти что-то конкретное. Я также заметил, что, поскольку у вас есть вложенные классы, вы вынуждены нарушать соглашения об именах и называть свои классы строчными буквами (возможно, это был выбор). Но эти аргументы являются более поверхностными, чем что-либо на самом деле неправильно.
Если, конечно, вам не нужно было реализовать бестелесную руку. Затем создание руки с помощью следующего сбивает с толку, потому что нет тела / туловища / стороны. (Также обратите внимание на запутанный корпус).
источник
Единственное преимущество, которое я могу придумать для вложенных классов, это то, что они могут быть сделаны частными (или защищенными). Я бы сказал, что в этом случае вложенные классы могут помочь вам инкапсулировать функциональность, если класс предназначен для использования внешним классом и только этим классом.
источник
По моему опыту, вложенные классы
Я кратко посмотрел на ваш класс, и сразу же я думаю, что:
Почему бы не разделить ваш класс на несколько классов и дать им отдельные пространства имен. Например
источник