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

В интерфейсе можно определить и индексатор. Объявление индексатора в интер­фейсе имеет следующий формат записи:

// Интерфейсный индексатор тип_элемента this[int индекс]{

get;

set;

)

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

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

// Добавление в интерфейс индексатора.

using System;

public interface ISeries { // Интерфейсное свойство,

int next {

get; // Возвращает следующее число ряда,

set; // Устанавливает следующее число ряда.

}

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

int this[int index] {

get; // Возвращает заданный член ряда.

}

// Реализация интерфейса ISeries,

class ByTwos : ISeries {

int val;

public ByTwos() {

val = 0;

}

// Получаем или устанавливаем значение с помощью // свойства,

public int next { get {

val += 2;

return val;

}

set {

val = value;

}

}

// Получаем значение с помощью индексатора,

public int this[int index] {

get {

val = 0;

for (int i=0; i<index; i++)

val += 2; return val;

}

}

// Демонстрируем использование интерфейсного индексатора, class SeriesDemo4 {

public static void Main() { ByTwos ob = new ByTwos();

// Получаем доступ к ряду посредством свойства, for(int i-0; i < 5; i++}

Console.WriteLine("Следующее значение равно " + ob.next);

Console.WriteLine("nНачинаем с числа 21");

ob.next = 21;

for(int i=0; i < 5; i++)

Console.WriteLine("Следующее значение равно " + ob.next);

Console.WriteLine("nПереход в исходное состояние."); ob.next - 0;

// Получаем доступ к ряду посредством индексатора, for(int i-0; i < 5; i++)

Console.WriteLine("Следующее значение равно " + ob[i]);

}

)

Вот результаты, сгенерированные этой программой:

Следующее значение равно 2

Следующее значение равно 4

Следующее значение равно 6

Следующее значение равно 8

Следующее значение равно 10

Начинаем с числа 21

Следующее значение равно 23

Следующее значение равно 25

Следующее значение равно 27

Следующее значение равно 29

Следующее значение равно 31

Переход в исходное состояние.

Следующее значение равно 0

Следующее значение равно 2

Следующее значение равно 4

Следующее значение равно 6

Следующее значение равно 8

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

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

// Один интерфейс может наследовать другой.

using System;

public interface A { void methl(); void meth2() ;

}

// Интерфейс В теперь включает методы methlО и meth2(),

// а также добавляет метод meth3().

public interface В : A {

void meth3 () ;

}

// Этот класс должен реализовать все методы

// интерфейсов А и В.

class MyClass : В {

public void methl() {

Console.WriteLine("Реализация метода methl().");

}

public void meth2() {

Console.WriteLine("Реализация метода meth2().");

}

public void meth3() {

Console.WriteLine("Реализация метода meth3().");

}

}

class IFExtend {

public static void Main() {

MyClass ob = new MyClassО;

ob.methlO;

ob.meth2() ; ob.meth3();

}

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