ООП С# Интерфейсы

Программирование на C# - ООП C#

ООП С# Интерфейсы

Ранее в настоящем приложении вы узнали о существовании двух типов наследования — наследование реализации и наследование интерфейса. До сих пор мы рассматривали наследование реализации. данном разделе мы рассмотрим более внимательно наследование интерфейса.

В общем случае интерфейс — это контракт, который говорит о том, что класс должен реализовывать определенные возможности (обычно методы и свойства), но этот контракт не специфицирует никакой конкретной их реализации. Таким образом, невозможно создать экземпляр интерфейса; вместо этого класс может декларировать, что он реализует один или более интерфейсов. В C#, как и в большинстве языков, поддерживающих интерфейсы, это, по сути, означает, что класс наследует интерфейс. Чтобы дать представление о том, как выглядит интерфейс в терминах программирования, ниже представлен синтаксис определения интерфейса IEnumerator, который содержится в библиотеке базовых классов .NET, в пространстве имен System.Collections. Интерфейс IEnumerator выглядит так:

 
interface IEnumerator
{
// Свойства
object Current {get; }
// Методы
bool MoveNext();
void Reset();
} 

Как видим, интерфейс C# IEnumerator имеет два метода и одно свойство. Этот интерфейс важен для реализации коллекций и спроектирован для того, чтобы инкапсулировать функциональность перемещения по элементам коллекций. MoveNext() перемещает к следующему элементу, Reset() возвращает к первому, а Current извлекает ссылку на текущий элемент. Помимо отсутствия реализации методов главное, что нужно здесь отметить — отсутствие любых модификаторов членов. Члены интерфейсов всегда общедоступны (public) и не могут быть объявлены как virtual или static.

Зачем же нужны интерфейсы в C#? До настоящего момента мы рассматривали классы как наборы определенных членов, и не задумывались о группировании любых этих членов вместе; наши классы просто содержали списки разнообразных методов, полей, свойств и так далее. Часто возникали ситуации, когда необходимо было знать, что класс реализует определенные средства, чтобы иметь возможность использовать его определенным образом. Примером может служить цикл foreach в C#. В принципе можно использовать foreach для итерации по экземпляру класса, если данный класс может вести себя как коллекция. Как же исполняющая система .NET может определить, что экземпляр класса представляет коллекцию?

Она опрашивает экземпляр, чтобы определить, что он реализует интерфейс System.Collections.IEnumerable. И если это так, исполняющая система использует методы этого интерфейса, чтобы выполнить итерацию по членам коллекции. Если же экземпляр не реализует этот интерфейс, то foreach возбудит исключение.

Возможно, возникнет вопрос — почему бы в этом случае просто не проверить, реализует ли класс требуемые методы и свойства? Ответ состоит в том, что это был бы не слишком надежный способ проверки. Например, можно легко представить множество причин, почему класс мог бы реализовывать методы под названием MoveNext() или Reset(), которые не имеют никакого отношения к коллекциям. Если класс декларирует, что он реализует интерфейсы, необходимые коллекциям, то можно быть уверенным, что это и есть коллекция.

Вторая причина использования интерфейсов в C# — способность к взаимодействию с COM. До появления .NET, COM и его более поздние версии DCOM и COM+ представляли основной способ взаимодействия приложений между собой на платформе Windows, и конкретная объектная модель, использованная COM, сильно зависела от интерфейсов. В самом деле, концепция интерфейсов впервые стала общеизвестной именно благодаря COM. Следует подчеркнуть, однако, что интерфейсы C# — это не то же самое, что интерфейсы COM. COM-интерфейсы подчиняются строгим требованиям, как, например, то, что они должны использовать GUID в качестве идентификаторов, что совсем не обязательно в интерфейсах C#. Однако, используя атрибуты (средство C#, упомянутое в начале нашей книги), можно “одеть” интерфейс C# так, что он будет работать как интерфейс COM, и тем самым обеспечить совместимость с COM.

 

Добавить комментарий


Защитный код
Обновить