Определение интерфейсов
Как упоминалось ранее, интерфейс представляет собой именованный набор сигнатур
методов. Обратите внимание, что в интерфейсах можно также определять события,
свойства — без параметров или с ними (последние в C# называют индексаторами),
поскольку все это просто упрощенные средства синтаксиса, которые в конечном
итоге все равно соответствуют методам. Однако в интерфейсе нельзя определять
ни конструкторы, ни экземплярные поля.
Хотя CLR допускает наличие в интерфейсах статических методов, статических
полей и конструкторов, а также констант, CLS-совместимый интерфейс не может
иметь подобных статических членов, поскольку некоторые языки не поддерживают
их определение или обращение к ним. C# не позволяет определять в интерфейсе
статические члены.
В C# для определения интерфейса, назначения ему имени и набора сигнатур
экземплярных методов используется ключевое слово
interface
. Вот определения
некоторых интерфейсов из библиотеки классов Framework Class Library:
public interface IDisposable {
void Dispose();
}
public interface IEnumerable {
IEnumerator GetEnumerator();
}
public interface IEnumerable : IEnumerable {
335
Наследование.интерфейсов
IEnumerator GetEnumerator();
}
public interface ICollection : IEnumerable, IEnumerable {
void Add(T item);
void Clear();
Boolean Contains(T item);
void CopyTo(T[] array, Int32 arrayIndex);
Boolean Remove(T item);
Int32 Count { get; } // Свойство только для чтения
Boolean IsReadOnly { get; } // Свойство только для чтения
}
С точки зрения CLR, определение интерфейса — почти то же, что и определение
типа. То есть CLR определяет внутреннюю структуру данных для объекта интер-
фейсного типа, а для обращения к различным членам интерфейса может использо-
вать отражение. Как и типы, интерфейс может определяться на уровне файлов или
быть вложенным в другой тип. При определении интерфейсного типа можно указать
требуемую область видимости и доступа (
public
,
protected
,
internal
и т. п.).
В соответствии с соглашением имена интерфейсных типов начинаются с про-
писной буквы
I
, что облегчает их поиск в исходном коде. CLR поддерживает
обобщенные интерфейсы (как показано в некоторых предыдущих примерах) и ин-
терфейсные методы. В этой главе я лишь слегка касаюсь некоторых возможностей
обобщенных интерфейсов, детали см. в главе 12.
Определение интерфейса может «наследовать» другие интерфейсы. Однако сло-
во «наследовать» не совсем точное, поскольку в интерфейсах наследование работает
иначе, чем в классах. Я предпочитаю рассматривать наследование интерфейсов как
включение контрактов других интерфейсов. Например, определение интерфейса
TCollection
включает контракт интерфейсов
TEnumerable
и
IEnumerable
.
Это означает следующее:
любой класс, наследующий интерфейс
ICollection
, должен реализовать
все методы, определенные в интерфейсах
ICollection
,
IEnumerable
и
IEnumerable
;
любой код, ожидающий объект, тип которого реализует интерфейс
ICollection
,
может быть уверен в том, что тип объекта также реализует методы интерфейсов
IEnumerable
и
IEnumerable
.
Do'stlaringiz bilan baham: |