Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие СS_Шульга.doc
Скачиваний:
48
Добавлен:
12.02.2015
Размер:
703.49 Кб
Скачать

Interface iOutput

{

Void outputName();

...

}

class CStudent : IOutput

{

public void outputName()

{

Console.WriteLine("ФИО студента: "+ name);

}

}

class CLector : IOutput

{

public void outputName()

{

Console.WriteLine("ФИО преподавателя: "+ name);

}

}

Заголовки методов в интерфейсе и реализации должны полностью совпадать.

Заметим, что методы интерфейса могут быть реализованы в классе наследнике как открытые и как закрытые. В нашем примере метод outputNameреализован как открытый.

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

CStudent s1 = new CStudent("Сидорова", "Информатика", gender_type.female, 1);

s1.outputName();

Ioutput s2 = new CStudent("Иванов", "Математика", gender_type.male, 2);

s2.outputName();

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

static void output (IOutput A) {A.outputName();}

CStudent ob1=new CStudent();

CLector ob2= CLector ();

output(ob1);// ФИО студента: Unknown

output (ob2);// ФИО преподавателя: Unknown

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

имя_объекта isимя_типа данных

Эта операция определяет, совместим ли текущий тип объекта, находящегося слева от ключевого слова is, с типом, заданным справа. Результат операции равен true, если объект можно преобразовать к заданному типу, и false в противном случае.

Операцию обычно используют с целью последующего явного преобразования объекта к типу интерфейса.

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

static void output( object A )

{

If ( a is iOutput )

{

((IOutput)A).outputName();

}

}

В метод outputможно передавать любые объекты, но на экран будут выведены только те, которые поддерживают интерфейс IOutput.

Недостатком использования операции is является то, что преобразование фактически выполняется дважды: при проверке и при собственно преобразовании. Более эффективной является другая операция — as. Она выполняет преобразование к заданному типу, а если это невозможно, формирует результат null, например:

static void output( object A )

{

IOutput person = A as IOutput;

if (person != null ) person. outputName ();

}

Обе рассмотренные операции применяются как к интерфейсам, так и к классам.

В библиотеке классов .NET определено множество стандартных интерфейсов, задающих желаемое поведение объектов. Например, интерфейс IComparable задает метод сравнения объектов на больше-меньше, что позволяет выполнять их сортировку. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable — клонировать объекты.

Стандартные интерфейсы поддерживаются многими стандартными классами библиотеки. Например, работа с массивами с помощью цикла foreach возможна именно потому, что тип Array реализует интерфейсы IEnumerable и IEnumerator. Можно создавать и собственные классы, поддерживающие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами.

Сравнение объектов

Интерфейс IComparable определен в пространстве имен System. Он содержит всего один метод CompareTo, возвращающий результат сравнения двух объектов — текущего и переданного ему в качестве параметра: