Po co więc tworzyć klasę zagnieżdżoną?
Mogę wymyślić kilka ważnych powodów:
1. Włącz enkapsulację
Wielokrotnie zagnieżdżone klasy są szczegółami implementacji klasy. Użytkownicy głównej klasy nie powinni martwić się o swoje istnienie. Powinieneś być w stanie je zmieniać do woli, bez konieczności zmiany kodu przez użytkowników klasy głównej.
2. Unikaj zanieczyszczenia nazwy
Nie należy dodawać typów, zmiennych, funkcji itp. W zakresie, chyba że są one odpowiednie w tym zakresie. Jest to nieco inne niż kapsułkowanie. Przydatne może być ujawnienie interfejsu typu zagnieżdżonego, ale właściwym miejscem dla typu zagnieżdżonego jest nadal główna klasa. W środowisku C ++ typy iteratorów są jednym z takich przykładów. Nie mam wystarczającego doświadczenia w języku C #, aby podać konkretne przykłady.
Stwórzmy uproszczony przykład, aby zilustrować, dlaczego przenoszenie zagnieżdżonej klasy do tego samego zakresu co główna klasa jest zanieczyszczeniem nazw. Załóżmy, że implementujesz klasę połączonych list. Normalnie byś użył
publid class LinkedList
{
class Node { ... }
// Use Node to implement the LinkedList class.
}
Jeśli zdecydujesz się przejść Node
do tego samego zakresu co LinkedList
, będziesz mieć
public class LinkedListNode
{
}
public class LinkedList
{
// Use LinkedListNode to implement the class
}
LinkedListNode
jest mało prawdopodobne, aby był użyteczny bez LinkedList
samej klasy. Nawet jeśli LinkedList
udostępniono pewne funkcje, które zwracają LinkedListNode
obiekt, z LinkedList
którego użytkownik może korzystać, nadal jest LinkedListNode
użyteczny tylko wtedy, gdy LinkedList
jest używany. Z tego powodu uczynienie klasy „węzła” klasą równorzędną LinkedList
zanieczyszcza zawarty zakres.