Разработка интерфейса
Обновлен: Ноябрь 2007
Интерфейс определяет подписи для набора членов, предоставляемых разработчиками. Интерфейсы не могут предоставлять членам подробные сведения о реализации. Например, в интерфейсе ICollection определяются члены, относящиеся к работе с коллекциями. Каждый конкретный класс, реализующий интерфейс, должен предоставить подробные сведения о реализации этих членов. Классы могут наследовать только от одного класса, однако они могут реализовать несколько интерфейсов. Представленные ниже рекомендации помогут обеспечить правильность разработки интерфейсов.
Определяйте интерфейс, если необходима поддержка некоторой общей функциональности набором типов, содержащим типы значения.
Типы значения должны наследовать от типа ValueType. Поэтому абстрактные классы нельзя использовать для описания контракта для типов значения; вместо этого следует использовать интерфейсы.
Рекомендуется определять интерфейс, если требуется поддержка его функциональности в типах, являющихся производными от какого-либо другого типа.
Избегайте использования интерфейсов-маркеров (интерфейсов без членов).
Одним из способов маркировки типов являются настраиваемые атрибуты. Дополнительные сведения о настраиваемых атрибутах см. в разделе Написание настраиваемых атрибутов. Настраиваемые атрибуты предпочтительнее, когда можно отложить проверку атрибута до выполнения кода. Если для сценария требуется проверка во время компиляции, эта рекомендация не может выполняться.
Предоставьте хотя бы один тип, являющийся реализацией интерфейса.
Это позволит удостовериться в правильности разработки интерфейса и может быть реализовано без особых сложностей. Класс Int32 предоставляет реализацию интерфейса IComparable.
Предоставьте хотя бы один член, использующий каждый из определенных интерфейсов (например, метод, принимающий интерфейс в качестве параметра, или свойство с типом интерфейса).
Это еще один механизм, который позволит удостовериться в правильности разработки интерфейса и может быть использован без особых сложностей.
Не добавляйте члены к ранее поставленному интерфейсу.
Добавление новых членов приведет к неработоспособности кода, реализующего предыдущую версию интерфейса. Это является одной из основных причин того, почему в общем случае классы являются предпочтительнее интерфейсов. Дополнительные сведения см. в разделе Выбор между классами и интерфейсами.
Если для поставляющего определения интерфейса требуются дополнительные члены, можно реализовать новый интерфейс и соответствующие члены для его использования.
Фрагменты — © Корпорация Майкрософт (Microsoft Corp.), 2005. Все права защищены.
Фрагменты — © Addison-Wesley Corporation. Все права защищены.
Дополнительные сведения о рекомендациях по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.
См. также
Основные понятия
Выбор между классами и интерфейсами