Базовые классы для реализации абстракций
Примечание.
Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.
Строго говоря, класс становится базовым, если другой класс является производным от него. Тем не менее в этом разделе подразумевается, что базовый класс — это класс, предназначенный главным образом для предоставления общей абстракции или для того, чтобы другие классы могли повторно использовать некоторую реализацию по умолчанию путем наследования. Базовые классы, как правило, располагаются в середине иерархий наследования — между абстракцией в корне иерархии и несколькими пользовательскими реализациями в нижней части.
Они выполняют роль вспомогательных методов для реализации абстракций. Например, одной из абстракций платформы для упорядоченных коллекций элементов является интерфейс IList<T>. Реализация IList<T> не является тривиальной, и поэтому платформа предоставляет несколько базовых классов, таких как Collection<T> и KeyedCollection<TKey,TItem>, которые выполняют роль вспомогательных методов для реализации пользовательских коллекций.
Базовые классы обычно не подходят для использования в качестве абстракций, так как они чаще всего содержат слишком много реализаций. Например, базовый класс Collection<T>
содержит множество реализаций, а это связано с тем фактом, что он реализует неуниверсальный интерфейс IList
(для лучшей интеграции с неуниверсальными коллекциями), и тем фактом, что это коллекция элементов, хранящихся в памяти в одном из своих полей.
Как уже говорилось, базовые классы могут предоставить бесценную помощь пользователям, которым необходимо реализовать абстракции, но в то же время они налагают значительную ответственность. Они добавляют контактную зону и увеличивают глубину иерархий наследования, поэтому концептуально усложняют платформу. Таким образом базовые классы следует использовать только в том случае, если они предоставляют значительные преимущества пользователям платформы. Их следует избегать, если они обеспечивают преимущества только разработчикам платформы. В этом случае настоятельно рекомендуется делегирование внутренней реализации вместо наследования от базового класса.
✔️ Рассмотрите возможность изменить базовые классы на абстрактные, даже если они не содержат абстрактных элементов. Благодаря этому пользователи получают четкую инструкцию о том, что класс предназначен только для наследования.
✔️ Рассмотрите возможность размещения базовых классов в пространстве имен, отдельном от типов основных сценариев. Базовые классы по определению предназначены для более сложных сценариев расширяемости, поэтому они не интересны большинству пользователей.
❌ Избегайте назначения базовым классам имени с суффиксом "Base", если класс предназначен для использования в общедоступных API-интерфейсах.
Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.
Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.