Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания 1-3 C#.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
439.81 Кб
Скачать

2.5. Реализация интерфейсов

Формат запи­си класса, который реализует интерфейс, таков:

class <имя_класса> : <имя_интерфейса>

{

// тело класса

}

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

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

Методы, которые реализуют интерфейс, должны быть объявлены открытыми. Дело в том, что методы внутри интерфейса неявно объявляются открытыми, поэтому их реализации также должны быть открытыми. Кроме того, сигнатура типа в реализации метода должна в точности совпадать с сигнатурой типа, заданной в определении ин­терфейса.

Рассмотрим пример реализации интерфейса ISeries, объявление которого приве­дено выше. Здесь создается класс с именем ByTwos, генерирующий ряд чисел, в кото­ром каждое следующее число больше предыдущего на два.

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

class ByTwos : ISeries

{

int start;

int val;

public ByTwos()

{

start = 0;

val = 0;

}

public int getNext()

{

val +=2;

return val;

}

public void reset()

{

val = start;

}

public void setStart(int x)

{

start = x;

val = start;

}

}

Как видите, класс ByTwos реализует все три метода, определенные интерфейсом ISeries. Иначе и быть не может, поскольку классу не разрешается создавать частич­ную реализацию интерфейса.

Рассмотрим пример, демонстрирующий использование класса ByTwos. Вот его код:

// Демонстрация использования интерфейса,

// реализованного классом ByTwos.

using System;

class SeriesDemo

{

public static void Main()

{

ByTwos ob = new ByTwos();

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

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

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

ob.reset();

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

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

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

ob.setStart(100);

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

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

}

}

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

Возможно, вы будете несколько удивлены, узнав, что можно объявить ссылочную переменную интерфейсного типа. Другими словами, можно создать переменную-ссылку на интерфейс. Такая переменная может ссылаться на любой объект, который реализует ее интерфейс. При вызове метода для объекта посредством интерфейсной ссылки будет выполнена та версия указанного метода, которая реализована этим объ­ектом. Этот процесс аналогичен использованию ссылки на базовый класс для доступа к объекту производного класса.

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