Бөлісу құралы:


Базовые классы для реализации абстракций

Замечание

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

Строго говоря, класс становится базовым классом, когда другой класс является производным от него. Однако в этом разделе базовый класс предназначен главным образом для предоставления общей абстракции или для других классов, чтобы повторно использовать некоторую реализацию по умолчанию посредством наследования. Базовые классы обычно находятся в середине иерархий наследования между абстракцией в корне иерархии и несколькими пользовательскими реализациями в нижней части.

Они служат вспомогательными средствами реализации для реализации абстракций. Например, одной из абстракций Платформы для упорядоченных коллекций элементов является IList<T> интерфейс. Реализация IList<T> не является тривиальной, поэтому платформа предоставляет несколько базовых классов, таких как Collection<T> и KeyedCollection<TKey,TItem>, которые служат вспомогательными средствами для реализации пользовательских коллекций.

Базовые классы обычно не подходят для того, чтобы служить абстракциями сами по себе, потому что они, как правило, содержат слишком много реализации. Например, базовый класс содержит много элементов реализации, связанных с тем, что он реализует негенерический интерфейс (для лучшей интеграции с негенерическими коллекциями) и с тем фактом, что это коллекция элементов, которые хранятся в памяти в одном из его полей.

Как уже говорилось ранее, базовые классы могут оказывать бесценную помощь пользователям, которым необходимо реализовать абстракции, но в то же время они могут быть значительной ответственностью. Они добавляют площадь поверхности и увеличивают глубину иерархий наследования, тем самым концептуально усложняя фреймворк. Поэтому базовые классы следует использовать только в том случае, если они обеспечивают значительное значение для пользователей платформы. Их следует избегать, если они предоставляют значение только для разработчиков платформы, в этом случае делегирование внутренней реализации вместо наследования от базового класса следует настоятельно учитывать.

✔️ Рассмотрите возможность абстрагирования базовых классов, даже если они не содержат абстрактных элементов. Это четко сообщает пользователям, что класс предназначен исключительно для наследования.

✔️ Рассмотрите возможность размещения базовых классов в отдельном пространстве имен, отличном от типов основного сценария. По определению базовые классы предназначены для расширенных сценариев расширяемости и поэтому не интересны большинству пользователей.

❌ Избегайте именования базовых классов с суффиксом Base, если класс предназначен для использования в общедоступных API.

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также