Частные внутренние классы в C# - почему они не используются чаще?

74
задан johnnyRose 19 April 2017 в 19:32
поделиться

4 ответа

Вложенные классы (вероятно, лучше всего для предотвращения слова, "внутреннего", поскольку, вложенные классы в C# несколько отличаются от внутренних классов в Java) могут действительно быть очень полезными.

Один шаблон, который не был упомянут, является "лучшим перечислимым" шаблоном - который может быть еще более гибким, чем тот в Java:

public abstract class MyCleverEnum
{
    public static readonly MyCleverEnum First = new FirstCleverEnum();
    public static readonly MyCleverEnum Second = new SecondCleverEnum();

    // Can only be called by this type *and nested types*
    private MyCleverEnum()
    {
    }

    public abstract void SomeMethod();
    public abstract void AnotherMethod();

    private class FirstCleverEnum : MyCleverEnum
    {
        public override void SomeMethod()
        {
             // First-specific behaviour here
        }

        public override void AnotherMethod()
        {
             // First-specific behaviour here
        }
    }

    private class SecondCleverEnum : MyCleverEnum
    {
        public override void SomeMethod()
        {
             // Second-specific behaviour here
        }

        public override void AnotherMethod()
        {
             // Second-specific behaviour here
        }
    }
}

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

78
ответ дан Jon Skeet 24 November 2019 в 12:00
поделиться

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

12
ответ дан Wim Coenen 24 November 2019 в 12:00
поделиться

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

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

3
ответ дан Tom Anderson 24 November 2019 в 12:00
поделиться

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

Вот краткий сводный список:

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

  2. Не НЕ использовать общедоступные вложенные типы в качестве логической групповой конструкции

  3. Избегайте использования открытых вложенных типов.

  4. 1212] НЕ НЕ используйте вложенные типы, если на тип, вероятно, будут ссылаться вне содержащего типа.

  5. НЕ НЕ используйте вложенные типы, если они должны быть созданы клиентским кодом .

  6. Не НЕ определяют вложенный тип как член интерфейса.

30
ответ дан 24 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: