Так зачем создавать вложенный класс?
Я могу вспомнить пару важных причин:
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загрязняет область действия.