Где и как использовать вложенные классы?

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

У меня есть класс Board, перемещайте классы, такие как ShortCastle, LongCastle, EnPassant, Promote и Pieces, такие как Pawn, Queen, Rook, Knight и т.д. Итак, ясно, что классы Board будут создавать экземпляры классов Piece, а классы Piece будут создавать классы Move. Для хорошего дизайна Promote move class должен быть вложенным в Pawn, потому что только пешка может продвигать себя. Шорты и длинные замки должны быть вложены в King, потому что только король может перемещаться таким образом.

Попытка поместить все классы Piece в класс Board не выглядит неплохо, потому что класс 8-9 будет внутри класса Board, и это будет очень раздражать один файл класса Board будет слишком большим и вряд ли удобочитаемым. Я предпочитаю держать каждую часть класс в другом файле. Хорошо, что мы можем создать частичный класс Board, но все же это не раздражает 8-9. Файлы классов Partial Board будут содержать каждый класс штук? Не лучше ли сделать их вложенными? То же самое о Pieces Создайте еще один частичный файл Piece только для другого класса типа Move? Если вложенный класс просто занимает небольшое пространство, поэтому это не будет проблемой, но если он принимает много методов?

Ответ 1

Я думаю, что вы слишком щедры с вложенными классами. Посмотрите это руководство по дизайну для вложенных типов.

Не используйте вложенные типы, если верно следующее:

  • Тип должен быть создан клиентский код. Если тип имеет общедоступный конструктор, он, вероятно, не должен быть вложенным. Обоснование этого что если вложенный тип может быть инстанцирован, это указывает что тип имеет место в библиотека сама по себе. Вы можете создать его, использовать его и уничтожить без используя внешний тип. Следовательно, это не должно быть вложенным. Внутренний тип не следует широко использовать за пределами внешнего типа без отношение к внешнему типу.
  • Ссылки на тип обычно объявлен в клиентском коде.

Кусочки могут принадлежать доске (Piece-collection как член?), но могут сосуществовать без нее. Вы могли бы f.e. хотите повторно использовать доски без кусков (темы и т.д.), а также повторно использовать куски без доски (позиции и т.д.).

Ответ 2

Частные члены родительского класса доступны для методов Nexted Class.

Следующий класс позволяет уменьшить сложность без широкой области.

Ответ 3

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

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

Ответ 4

Если вы действительно считаете, что вложенные классы имеют смысл для вашего дизайна (см. указания Тима Шмельтера), но чувствуйте, что размер файла слишком велик, использование частичных классов прекрасно разделяет вложенные определения класса в свои собственные файлы. Или, если вложенные классы достаточно малы по своему усмотрению, но у вас их большое количество, поместите все вложенные классы в один неполный файл.

Parent.cs:

public partial class Parent
{
    void SomeMethod()
    {
        Nested1 n1 = new Nested1();
        Nested2 n2 = new Nested2();
    }
}

Nested.cs:

public partial class Parent
{
    private class Nested1
    {

    }
    private class Nested2
    {

    }
}

Ответ 5

Вложенные классы имеют свое место, но могут смущать работу. Я нашел веб-страницу, в которой показано, как использовать некоторые .Net-классы для получения JSON-вывода на стене сообщений в формате http://www.virtualsecrets.com/graph-api-json-facebook-handler.html. Что интересно здесь что классы вложены внутри классов, внутри других классов - так что это можно сделать, немного сложнее.:)