Когда вы хотите вкладывать классы в C#?
В частности, может ли кто-нибудь дать мне конкретные примеры того, когда или когда не следует использовать вложенные классы?
Я знал об этой функции с незапамятных времен, но у меня никогда не было причин ее использовать.
Благодарю.
9 ответов
Когда вложенный класс используется только внешним классом, отличный пример, который больше не нужен, - это класс перечислителя для коллекции.
другим примером может быть перечисление для замены истинного ложного параметра, используемого методом в классе, для уточнения сигнатуры вызова...
вместо
public class Product
{
public void AmountInInventory(int warehouseId, bool includeReturns)
{
int totalCount = CountOfNewItems();
if (includeReturns)
totalCount+= CountOfReturnedItems();
return totalCount;
}
}
а также
product P = new Product();
int TotalInventory = P.AmountInInventory(123, true);
что оставляет неясным, что означает "истинный", вы могли бы написать:
public class Product
{
[Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
public void AmountInInventory(int warehouseId, Include include)
{
int totalCount = 0;
if ((include & Include.New) == Include.New)
totalCount += CountOfNewItems();
if ((include & Include.Returns) == Include.Returns)
totalCount += CountOfReturns();
return totalCount;
}
}
product P = new Product();
int TotalInventory = P.AmountInInventory(123, Product.Include.All);
Что делает значение параметра понятным в коде клиента.
Два места, где я использую вложенные классы:
Вложенный класс используется исключительно внешним классом, и я хочу полностью закрытую область видимости.
Вложенный класс используется специально для реализации интерфейса, определенного в другом месте. Например, реализация перечислителя попадает в эту категорию.
Вы действительно хотите использовать вложенные классы только тогда, когда уверены, что вложенный класс не имеет смысла, что он будет использоваться где-либо еще.
Например, если вам нужно было создать список объектов нескольких типов, связанных с функциями и информацией о членах этого набора объектов, на короткое время (например, методы или свойства), вы можете использовать для этого вложенный класс. Может быть, вам нужно создать список всех комбинаций объекта определенного типа, а затем отметить все комбинации, которые имеют определенное свойство. Это было бы хорошим случаем для вложенного класса.
Если вам не нужны методы для вложенного класса, вы, вероятно, можете просто использовать структуру, но я не знаю, относится ли IL к ним по-другому.
Я иногда использую это для простых вспомогательных классов, которые мне нужны для функции или двух внутри родительского класса.
Для практического примера посмотрите этот вопрос, заданный ранее этим утром:
Сделать объект доступным только для одного другого объекта в той же сборке?
Резюме: вы можете вложить связанный класс данных в его бизнес-объект.
Я видел случаи вложенных классов, когда структура данных специального назначения используется только в одном классе, или выбрасывается определенное исключение, которое перехватывается только в одном классе.
Я хотел бы улучшить мой предыдущий ответ!
Конкретная область, в которой я регулярно использую вложенные классы - это включение интерфейса и инверсия управления. Пример...
public class Worker
{
private IHelper _helper;
public Worker()
: this (new DefaultHelper())
{
}
public Worker(IHelper helper)
{
this._helper = helper;
}
private class DefaultHelper : IHelper
{
}
}
Я вкладываю классы, когда у меня есть вспомогательный класс, который не должен быть видимым для любого другого объекта в системе. Это сохраняет видимость максимально ограниченной, что помогает предотвратить непреднамеренное использование класса
Следуя "правилам" дядюшки Боба о сплоченности, вы обнаружите, что вы на самом деле создаете довольно много вложенных (и вложенных, вложенных!) Классов. Они могут быть сделаны не вложенными, но только если у вас есть другие клиенты, которые ссылаются на них сейчас.