- •Лабораторная работа №1 знакомство со средой визуального программирования ms visual studio
- •2. Домашнее задание и методические указания по его выполнению
- •2.1. Обзор Microsoft Visual Studio 2005
- •2.2. Создание простого приложения в ms Visual Studio
- •2. Домашнее задание и методические указания по его выполнению
- •2.1. Условные операторы
- •2.1.1 Оператор if
- •2.2. Отладка программы
- •2.3. Пошаговый режим
- •3. Лабораторное задание и методические указания по его выполнению
- •4. Контрольные вопросы
- •Лабораторная работа №2 управляющие операторы
- •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.4. Полиморфизм.
Концепцию полиморфизма часто выражают такой фразой: "один интерфейс — много методов". Это означает, что для выполнения группы подобных действий можно разработать общий интерфейс. Полиморфизм позволяет понизить степень сложности программы, предоставляя программисту возможность использовать один и тот же интерфейс для задания общего класса действий. Конкретное (нужное в том или ином случае) действие (метод) выбирается компилятором. Программисту нет необходимости делать это вручную. Его задача — правильно использовать общий интерфейс.
2.4.1. Абстрактные классы.
Методы класса могут быть объявлены как абстрактные. Это означает, что в этом классе нет реализации этих методов. Абстрактные методы пишутся с модификатором abstract. Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным (в таком классе могут быть и обычные методы). Нельзя создавать экземпляры абстрактного класса — такой класс может использоваться только в качестве базового класса для других классов. Для потомка такого класса есть две возможности — или он реализует все абстрактные методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать его экземпляры), или реализует не все абстрактные методы базового класса (в этом случае он является тоже абстрактным классом, и единственная возможность его использования — это производить от него классы-потомки). Вот пример, иллюстрирующий использование абстрактных классов:
using System;
namespace test
{
abstract class Figure
{
//Площадь фигуры
public abstract double square();
public abstract double perimeter();
}
class Triangle: Figure
{
//Фундаментальные понятия
double а, b, с; //Стороны
//Конструктор
public Triangle (double a, double b, double с)
{
this.a=a;
this .b=-b;
this.c=c;
}
public override double square()
{
double p - (a/b+c)/2;
return Math.Sqrt(p*(p-a)* (p-b)* (p-c));
}
public override double perimeter()
{
return a-ib+c;
}
class Test
{
public static void Main()
{
Figure fl, f2;
fl=new Triangle(3, 4, 5);
System.Console.WriteLine(f1.perimeter()+","+ f1.square());
}
}
Результаты работы программы отобразятся как:
12, 6
16, 12
Тут мы объявляем абстрактный класс Figure, от которого производим класс Triangle (треугольника). В классе Figure есть два абстрактных метода — square (для подсчета площади) и perimeter (для периметра). Так как для произвольной фигуры формул для площади и для периметра не существует, то эти методы объявлены в классе Figure и переопределены в производных классах (с ключевым словом override). Далее в классе Test мы проводим испытание — заводим переменную ссылочного типа базового класса Figure, ниже в эти ссылки мы записываем созданный экземпляр производного класса Triangle. Обратите внимание, что ссылку на абстрактный класс мы создать можем, а экземпляр — нет. Далее мы выводим на экран периметр и площадь для нашей фигуры.
2.5. Интерфейсы.
Интерфейсы синтаксически подобны абстрактным классам. Однако в интерфейсе ни один метод не может включать тело, т.е. интерфейс в принципе не предусматривает какой бы то ни было реализации. Он определяет, что должно быть сделано, но не уточняет, как. Коль скоро интерфейс определен, его может реализовать любое количество классов. При этом один класс может реализовать любое число интерфейсов.
Для реализации интерфейса класс должен обеспечить тела (способы реализации) методов, описанных в интерфейсе. Каждый класс может определить собственную реализацию. Таким образом, два класса могут реализовать один и тот же интерфейс различными способами, но все классы поддерживают одинаковый набор методов. Предоставляя программистам возможность применения такого средства программирования, как интерфейс, С# позволяет в полной мере использовать аспект полиморфизма, выражаемый как "один интерфейс — много методов".
Интерфейсы объявляются с помощью ключевого слова interface. Вот как выглядит упрошенная форма объявления интерфейса:
interface <имя>
{
<тип_возврата> <имя_метода1>(список_параметров) ;
<тип_возврата> <имя_метода2>(список_параметров);
…
<тип_возврата> <имя_методаN>(слисок_параметров);
}
Имя интерфейса задается элементом <имя>. Методы объявляются с использованием лишь типа возвращаемого ими значения и сигнатуры. Все эти методы, по сути, — абстрактные. В интерфейсе методы неявно являются открытыми (public-методами), при этом не разрешается явным образом указывать спецификатор доступа.
Рассмотрим пример интерфейса для класса, который генерирует ряд чисел:
public interface ISeries
{
int getNextO; // Возвращает следующее число ряда,
void reset{); // Выполняет перезапуск,
void setStart(int x); // Устанавливает начальное
// значение.
}
Этот интерфейс имеет имя ISeries. Хотя префикс "I" необязателен, многие программисты его используют, чтобы отличать интерфейсы от классов. Интерфейс ISeries объявлен открытым, поэтому он может быть реализован любым классом в любой программе.
Интерфейсы не могут иметь членов данных. Они не могут определять конструкторы, деструкторы или операторные методы. Кроме того, ни один член интерфейса не может быть объявлен статическим.
