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ść Nodedo tego samego zakresu co LinkedList, będziesz mieć
public class LinkedListNode
{
}
public class LinkedList
{
// Use LinkedListNode to implement the class
}
LinkedListNodejest mało prawdopodobne, aby był użyteczny bez LinkedListsamej klasy. Nawet jeśli LinkedListudostępniono pewne funkcje, które zwracają LinkedListNodeobiekt, z LinkedListktórego użytkownik może korzystać, nadal jest LinkedListNodeużyteczny tylko wtedy, gdy LinkedListjest używany. Z tego powodu uczynienie klasy „węzła” klasą równorzędną LinkedListzanieczyszcza zawarty zakres.