Поделиться через


Проектирование интерфейса

Замечание

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

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

Среда CLR не поддерживает несколько наследование (т. е. классы CLR не могут наследоваться от нескольких базовых классов), но позволяет типам реализовывать один или несколько интерфейсов в дополнение к наследованию от базового класса. Поэтому интерфейсы часто используются для достижения эффекта множественного наследования. Например, IDisposable — это интерфейс, позволяющий типам поддерживать возможность освобождения ресурсов независимо от любой другой иерархии наследования, в которых они участвуют.

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

✔️ Определите интерфейс, если вам нужен общий API для поддержки набора типов, включающих типы значений.

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

❌ Избегайте использования интерфейсов маркеров (интерфейсов без элементов).

Если необходимо пометить класс как имеющий определенную характеристику (маркер), в целом используйте настраиваемый атрибут, а не интерфейс.

✔️ Обеспечьте по крайней мере один тип, который является реализацией интерфейса.

Это помогает проверить дизайн интерфейса. Например, List<T> это реализация IList<T> интерфейса.

✔️ DO предоставляет по крайней мере один API, который использует каждый определяемый интерфейс (метод, принимаюющий интерфейс в качестве параметра или свойства, типизированного в качестве интерфейса).

Это помогает проверить дизайн интерфейса. Например, List<T>.Sort использует System.Collections.Generic.IComparer<T> интерфейс.

❌ НЕ добавляйте членов в интерфейс, который ранее был выпущен.

Это приведет к разрыву реализаций интерфейса. Чтобы избежать проблем с управление версиями, необходимо создать новый интерфейс.

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

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

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

См. также