Klasy bazowe na potrzeby implementowania abstrakcji

Uwaga

Ta zawartość jest drukowana przez uprawnienie Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.

Mówiąc ściśle, klasa staje się klasą bazową, gdy pochodzi od niej inna klasa. Jednak w tej sekcji klasa bazowa jest klasą zaprojektowaną głównie w celu zapewnienia wspólnej abstrakcji lub innych klas w celu ponownego użycia implementacji domyślnej choć dziedziczenia. Klasy bazowe zwykle znajdują się w środku hierarchii dziedziczenia, między abstrakcją w katalogu głównym hierarchii i kilkoma niestandardowymi implementacjami u dołu.

Służą one jako pomocnicy implementacji do implementowania abstrakcji. Na przykład jedną z abstrakcji struktury dla uporządkowanych kolekcji elementów jest IList<T> interfejs. Implementacja IList<T> nie jest banalna, dlatego struktura udostępnia kilka klas bazowych, takich jak Collection<T> i KeyedCollection<TKey,TItem>, które służą jako pomocnicy do implementowania kolekcji niestandardowych.

Klasy bazowe zwykle nie nadają się do samodzielnego służyć jako abstrakcje, ponieważ mają tendencję do zbyt dużej implementacji. Na przykład klasa bazowa Collection<T> zawiera wiele implementacji związanych z faktem, że implementuje interfejs niegenericzny IList (aby lepiej zintegrować z kolekcjami niegenernymi) oraz fakt, że jest to kolekcja elementów przechowywanych w pamięci w jednym z jej pól.

Jak wspomniano wcześniej, klasy bazowe mogą zapewnić nieocenioną pomoc dla użytkowników, którzy muszą implementować abstrakcję, ale jednocześnie mogą stanowić znaczącą odpowiedzialność. Zwiększają one obszar powierzchni i zwiększają głębokość hierarchii dziedziczenia i tak koncepcyjnie komplikują strukturę. W związku z tym klasy bazowe powinny być używane tylko wtedy, gdy zapewniają znaczącą wartość użytkownikom platformy. Należy unikać ich, jeśli zapewniają one wartość tylko implementatorom struktury, w tym przypadku delegowanie do wewnętrznej implementacji zamiast dziedziczenia z klasy bazowej powinno być zdecydowanie brane pod uwagę.

✔️ ROZWAŻ, aby klasy bazowe były abstrakcyjne, nawet jeśli nie zawierają żadnych abstrakcyjnych elementów członkowskich. Wyraźnie komunikuje się to użytkownikom, że klasa jest przeznaczona wyłącznie do dziedziczenia.

✔️ ROZWAŻ umieszczenie klas bazowych w oddzielnej przestrzeni nazw od typów scenariuszy linii głównej. Z definicji klasy bazowe są przeznaczone dla zaawansowanych scenariuszy rozszerzalności i dlatego nie są interesujące dla większości użytkowników.

❌ UNIKAJ nazewnictwa klas bazowych z sufiksem "Base", jeśli klasa jest przeznaczona do użycia w publicznych interfejsach API.

© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional w ramach Microsoft Windows Development Series.

Zobacz też