Так зачем создавать вложенный класс?
Я могу вспомнить пару важных причин:
1. Включить инкапсуляцию
Многократно вложенные классы являются деталями реализации класса. Пользователи основного класса не должны заботиться об их существовании. Вы должны иметь возможность изменять их по своему усмотрению, не требуя от пользователей основного класса изменять свой код.
2. Избегайте загрязнения имени
Не следует добавлять типы, переменные, функции и т. Д. В область, если они не подходят для этой области. Это немного отличается от инкапсуляции. Может быть полезно раскрыть интерфейс вложенного типа, но надлежащее место для вложенного типа по-прежнему остается основным классом. В земле C ++ типы итераторов являются одним из таких примеров. Я не обладаю достаточным опытом в C #, чтобы дать вам конкретные примеры.
Давайте создадим упрощенный пример, чтобы проиллюстрировать, почему перемещение вложенного класса в ту же область, что и основной класс, является загрязнением имени. Допустим, вы реализуете класс связанного списка. Обычно вы бы использовали
publid class LinkedList
{
class Node { ... }
// Use Node to implement the LinkedList class.
}
Если вы решите перейти Node
на ту же область LinkedList
, что и у вас будет
public class LinkedListNode
{
}
public class LinkedList
{
// Use LinkedListNode to implement the class
}
LinkedListNode
вряд ли будет полезен без LinkedList
самого класса. Даже если LinkedList
предоставлены некоторые функции, которые возвращают LinkedListNode
объект, который LinkedList
может использовать пользователь, он все равно становится LinkedListNode
полезным только при LinkedList
использовании. По этой причине, превращение класса «узел» в класс равноправного узла LinkedList
загрязняет область действия.