
- •Лабораторная работа №1 знакомство со средой визуального программирования ms visual studio
- •2. Домашнее задание и методические указания по его выполнению
- •2.1. Обзор Microsoft Visual Studio 2005
- •2.2. Создание простого приложения в ms Visual Studio
- •2.2. Отладка программы
- •2.3. Пошаговый режим
- •3. Лабораторное задание и методические указания по его выполнению
- •4. Контрольные вопросы
- •Лабораторная работа №2 управляющие операторы
- •2. Домашнее задание и методические указания по его выполнению
- •2.1. Условные операторы
- •2.1.1 Оператор if
- •2.1.2 Оператор switch
- •2.2 Операторы перехода
- •2.2.1 Операторы break и continue
- •2.2.2 Оператор return
- •2.3 Операторы цикла
- •2.3.1 Оператор for
- •2.3.2 Цикл while
- •2.3.3 Цикл do-while
- •3. Лабораторное задание и методические указания по его выполнению
- •4. Контрольные вопросы
- •5. Варианты заданий
- •Лабораторная работа №3 классы. Наследование. Полиморфизм. Интерфейсы.
- •2. Домашнее задание и методические указания по его выполнению
- •2.1 Основные понятия объектно-ориентированного программирования
- •2.2. Класса. Организация классов.
- •2.2.1. Поля и методы
- •2.2.2. Объявление объектов класса. Инициализация членов класса.
- •2.2.3. Конструкторы и деструкторы.
- •2.2.4. Пример работы с классами
- •2.3. Наследование
- •2.4. Полиморфизм.
- •2.4.1. Абстрактные классы.
- •2.5. Интерфейсы.
- •2.5. Реализация интерфейсов
- •3. Лабораторное задание и методические указания по его выполнению
- •4. Варианты заданий
- •Библиографический список
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. Следовательно, интерфейсную ссылочную переменную нельзя использовать для доступа к другим переменным или методам, которые может определить объект, реализующий этот интерфейс.