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

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 объявлен открытым, поэтому он может быть реализован любым классом в любой программе.

Интерфейсы не могут иметь членов дан­ных. Они не могут определять конструкторы, деструкторы или операторные методы. Кроме того, ни один член интерфейса не может быть объявлен статическим.