Вопрос

В частности, может ли кто-нибудь дать мне конкретные примеры того, когда или когда не следует использовать вложенные классы?

Я знал об этой функции всегда, но никогда не было причин ее использовать.

Спасибо.

Это было полезно?

Решение

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

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

вместо

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
  {
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top