Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

13.Интерфейсы

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

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

13.1Объявления интерфейсов

Объявление_интерфейса является объявлением_типа (§9.6), где объявляется новый тип интерфейса.

объявление_интерфейса: атрибутынеобязательно модификаторы_интерфейсанеобязательно partialнеобязательно interface идентификатор список_параметров_типа_вариантанеобязательно база_интерфейсанеобязательно предложения_ограничений_параметров_типанеобязательно тело_интерфейса ;необязательно

Объявление_интерфейса состоит из необязательного набора атрибутов (§17), за которым следуют необязательный набор модификаторов_интерфейса (§13.1.1), необязательный модификатор partial, ключевое слово interface и идентификатор, именующий интерфейс, необязательная спецификация списка_параметров_типа_варианта (§13.1.3), необязательная спецификация базы_интерфейса (§13.1.4), необязательная спецификация предложений_ограничений_параметров_типов (§10.1.5) и тело_интерфейса (§13.1.5), которое может завершаться точкой с запятой.

13.1.1Модификаторы интерфейса

Объявление_интерфейса может включать последовательность модификаторов интерфейса:

модификаторы_интерфейса: модификатор_интерфейса модификатор_интерфейса модификаторы_интерфейса

модификатор_интерфейса: new public protected internal private

Включение одного модификатора в объявление интерфейса несколько раз приведет к возникновению ошибки при компилировании.

Модификатор new разрешен только в том случае, если интерфейс определяется внутри класса. Он указывает, что в интерфейсе скрыт унаследованный член с таким же именем (см. §10.3.4).

Модфикаторы public, protected, internal и private управляют доступом к интерфейсу. Допустимые модификаторы определяются контекстом объявления интерфейса (§3.5.1).

13.1.2Модификатор partial

Модификатор partial указывает, что данное объявление_интерфейса является частичным объявлением типа. Несколько частичных объявлений интерфейса с одним именем в едином пространстве имен или объявлении типа объединяются в одно объявление интерфейса с соблюдением правил, приведенных в §10.2.

13.1.3Списки параметров типа варианта

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

список_параметров_типа_варианта: < параметры_типа_варианта >

параметры_типа_варианта: атрибутынеобязательно аннотация_вариантанеобязательно параметр_типа параметры_типа_варианта , атрибутынеобязательно аннотация_вариантанеобязательно параметр_типа

аннотация_варианта: in out

Если аннотация варианта имеет значение out, тип параметра называется ковариантным. Если аннотация варианта имеет значение in, тип параметра называется контрвариантным. Если аннотации варианта нет, тип параметра называется инвариантным.

В этом примере

interface C<out X, in Y, Z> { X M(Y y);

Z P { get; set; } }

X является ковариантным, Y – контрвариантным, а Z – инвариантным.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]