Книга: C# для профессионалов. Том II

Интерфейсы

Интерфейсы

Интерфейсы являются особенностью C#, которая не имеет аналога в ANSI C++, хотя компания Microsoft ввела интерфейсы в C++ с помощью специального ключевого слова. Идея интерфейса развилась из интерфейсов COM, которые предназначены служить контрактом, который указывает, какие методы или свойства реализует объект.

Интерфейс в C# не совсем такой, как интерфейс COM, так как он не имеет связанного с ним GUID, не является производным из IUnknown и не имеет связанных с ним записей в реестре (хотя можно отобразить интерфейс C# на интерфейс COM). Интерфейс C# является просто множеством определений функций и свойств. Он может рассматриваться как аналог абстрактного класса и определяется с помощью синтаксиса аналогичного класса.

interface IMyInterface {
 void MyMethod(int X);
}

Можно заметить, однако, следующие синтаксические различия с определением класса:

? Методы не имеют модификаторов доступа.

? Методы никогда не реализуются в интерфейсе.

? Методы не объявляются виртуальными или явно абстрактными. Выбор методов принадлежит классу, который реализует этот интерфейс.

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

class MyClass : MyBaseClass, IMyInterface, IAnotherInterface // и т.д.
{
 public virtual void MyMethod(int X) {
  // реализация
 }
 // и т.д.

В этом примере выбрана реализация MyMethod как виртуального метода с открытым доступом.

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

interface IMyInterface : IBaseInterface

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

IMyInterface MyInterface;
MyClass Mine = new MyClass();
MyInterface = Mine as IMyInterface;
if (MyInterface != null) MyInterface.MyMethod(10);

Основные применения интерфейсов следующие:

? Взаимодействовать и устанавливать обратную совместимость с компонентами COM.

? Служить в качестве контракта для других классов .NET. Интерфейс может использоваться для указания, что класс реализует некоторые свойства. Например, цикл C# foreach работает внутренне, проверяя, что класс, в котором он используется, реализует интерфейс IEnumerate, и вызывая затем методы, определенные этим интерфейсом.

Оглавление книги


Генерация: 0.201. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз