Здесь важно понимать, что, хотя классы Primes и ByTwos генерируют разные ряды чисел, оба они реализуют один и тот же интерфейс ISeries
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Использование интерфейсных ссылок

Ссылочная переменная интерфейсного типа может ссылаться на любой объект, который реализует ее интерфейс.

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

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

Интерфейсные свойства

Формат объявления:

Тип имя

{

get;

set;

}

Свойства, предназначенные только для чтения или только для записи, содержат только get- или set-элемент, соответственно.

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

Формат объявления:

тип_элементa this [int индекс]

{

get;

set;

}

Индексаторы, предназначенные только для чтения или только для записи, содержат только get- или set- элемент, соответственно.

Наследование интерфейсами интерфейсов

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

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

Пример:

public interface IA { . . . }

public interface IВ : IA { . . . }

class MyClass : IВ { . . . } // Класс должен реализовать члены IA и IB

В производном интерфейсе можно объявить член, который скрывает член, определенный в базовом интерфейсе (член д.б. помечен как new).

Явная реализация членов интерфейса

При реализации члена интерфейса можно квалифицировать его имя с использованием имени интерфейса (явная реализация).

В этом случае такой член будет недоступен вне класса.

Interface IA

{

int Method (int x);

}

// Явная реализация интерфейсного метода

Class Class : IA

{

int IA.Method(int x)

{

   return x / 3;

}

}

Причина: класс может реализовать два интерфейса, которые объявляют методы с одинаковыми именами и типами. Полная квалификация имен позволяет избежать неопределенности.

Для чего нужны интерфейсы

Интерфейс не несет в себе никакой функциональности, а объявленные в интерфейсе методы можно реализовать в классе и без существования интерфейса. Почему же он бывает необходим?

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

Если Вы решили реализовать класс с интерфейсом, который будет использовать какая-либо программа (клиент), то компилятор не позволит Вам сделать ошибку в количестве методов, которые необходимо реализовать, сигнатуре каждого метода интерфейса и возвращаемом им значении.

Программа, использующая класс, в котором должен быть реализован интерфейс, может удостовериться в этом, прежде чем вызывать его интерфейсные методы, с помощью рефлексии или операторов as или is:

   if (!(ob is IA))

        throw new Exception ("Объект НЕ реализует интерфейс IA");

Ряд средств языка во время выполнения программы так же осуществляют проверку наличия интерфейса.

 

Например, оператор foreach опрашивает объект, на предмет того, реализует ли он интерфейс System.Collection.IEnumerable.

Если Вы подготовили объект с этим интерфейсом, то оператор foreach будет успешно использовать Ваш метод GetEnumerator(). Этот метод возвратит объект с методом MoveNext() и свойством Current для доступа к очередному элементу коллекции.

Если окажется, что объект не реализует требуемый интерфейс, foreach сгенерирует исключение.

Интерфейсы коллекций

В С# под коллекцией понимается группа объектов. Пространство имен System. Collections содержит множество интерфейсов и классов, которые определяют и реализуют коллекции различных типов. Все эти коллекции разработаны на основе набора четко определенных интерфейсов.

Ряд встроенных реализаций интерфейсов в таких коллекциях как ArrayList, Hashtable, Stack и Queue, вы можете использовать "как есть".

Дата: 2019-02-02, просмотров: 267.