Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТПР Лр-1.2(Классы).docx
Скачиваний:
0
Добавлен:
01.03.2020
Размер:
117.05 Кб
Скачать

Полиморфизм интерфейсов

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

Например, предположим, что вместо базового класса Animal метод EatFood() помещается в интерфейс по имени IConsume. Этот интерфейс могут поддерживать оба класса — Cow и Chicken, — но только в таком случае каждый из них должен обязательно иметь свою реализацию метода EatFood() (поскольку интерфейсы не содержат реализаций). После этого к этому методу станет можно получать доступ с помощью примерно такого кода:

Cow myCow = new Cow();

Chicken myChicken = new Chicken();

IConsume consumelnterface;

consumeInterface = myCow;

consumeInterface.EatFood();

consumeInterface = myChicken;

consumeInterface.EatFood();

Такой подход предоставляет простой способ для вызова множества объектов одинаковым образом и избавляет от зависимости от общего базового класса. В этом коде вызов consumeInterfасe. EatFood () будет приводить к вызову метода EatFood () либо класса Cow, либо класса Chicken, в зависимости от того, какой экземпляр будет присвоен переменной типа интерфейса.

Здесь важно обратить внимание на то, что производные классы наследуют интерфейсы, поддерживаемые их базовыми классами. В предыдущем примере интерфейс IConsume может поддерживаться как классом Animal, так и обоими классами Cow и Chicken. Запомните, что классы с общим базовым классом вовсе необязательно имеют общие интерфейсы и наоборот.

Практическая часть. (Задание студентам).

Написать класс и проверить его работу в консольном приложении. Задачи определить по варианту.

Задание на лабораторную работу 1.2

Задача 1 и задача 2 берутся из одного списка.

Варианты заданий

№ варианта

Задача 1

Задача 2

1

14

13

2

6

17

3

13

14

4

16

3

5

13

6

6

3

12

7

17

3

8

13

2

9

9

4

10

13

8

11

9

9

12

16

4

13

15

13

14

17

2

15

4

16

16

9

2

17

14

10

18

6

6

19

5

4

20

7

7

21

5

1

22

14

11

23

2

4

24

3

16

        1. Создать базовый класс с виртуальной функцией – площадь и периметр. Создать производные классы: прямоугольник, круг, прямоугольный треугольник, трапеция, со своими функциями площади

        2. Создать класс с виртуальной функцией: норма. Создать производные классы: комплексные числа, вектор из 10 элементов, матрица (2х2). Определить функцию нормы - для комплексных чисел - модуль в квадрате, для вектора - корень квадратный из суммы элементов по модулю, для матрицы - максимальное значение по модулю.

        3. Создать абстрактный класс (кривые) вычисления координаты y для некоторой x. Создать производные классы: прямая, эллипс, гипербола со своими функциями вычисления y в зависимости от входного параметра x. Уравнение прямой: y=ax+b , эллипса: x2/a2+y2/b2=1, гиперболы: x2/a2-y2/b2=1.

        4. Создать абстрактный базовый класс с виртуальной функцией - сумма прогрессии. Создать производные классы: арифметическая прогрессия и геометрическая прогрессия. Каждый класс имеет два поля типа double. Первое - первый член прогрессии, второе (double) - постоянная разность (для арифметической) и постоянное отношение (для геометрической). Определить функцию вычисления суммы, где параметром является количество элементов прогрессии.

          1. Арифметическая прогрессия aj=a0+jd, j=0,1,2,…

          2. Сумма арифметической прогрессии: sn=(n+1)(a0+an)/2

          3. Геометрическая прогрессия: aj=a0rj, j=0,1,2,…

          4. Сумма геометрической прогрессии: sn=(a0-anr)/(1-r)

        5. Создать базовый класс - фигура, и производные класс - круг, прямоугольник, трапеция. Определить виртуальные функции площадь, периметр и вывод на печать.

        6. Создать базовый класс - работник и производные классы - служащий с почасовой оплатой, служащий в штате и служащий с процентной ставкой. Определить функцию начисления зарплаты.

        7. Создать абстрактный базовый класс с виртуальной функцией - площадь поверхности. Создать производные классы: параллелепипед, тетраэдр, шар со своими функциями площади поверхности. Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов. Площадь поверхности параллелепипеда: S=6xy. Площадь поверхности шара: S=4 r2. Площадь поверхности тетраэдра: S=a2 3

        8. Создать класс человек, производные от которого девушки и молодые люди. Определить виртуальную функцию реакции человека на вновь увиденного другого человека. Перегрузить эту функцию и организовать случайный выбор этой функции.

        9. Создать абстрактный базовый класс с виртуальной функцией - объем. Создать производные классы: параллелепипед, пирамида, тетраэдр, шар со своими функциями объема. Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов. Объем параллелепипеда - V=xyz (x,y,z - стороны , пирамиды: V=xyh (x,y, - стороны, h - высота), тетраэдра: V= a3 2/12, шара: V=4 r3/3.

        10. Создать абстрактный класс - млекопитающие. Определить производные классы - животные и люди. У животных определить производные классы собак и коров. Определить виртуальные функции описания человека, собаки и коровы.

        11. Создать класс биологических организмов с учетом их местоположения. Определить наследуемые классы - лиса, кролик и трава. Лиса ест кролика. Кролик ест траву. Лиса может умереть - определен возраст. Кролик тоже может умереть. Кроме этого определен класс - отсутствие жизни. Если в окрестности имеется больше травы, чем кроликов, то трава остается, иначе трава съедена. Если лис слишком старый он может умереть. Если лис слишком много (больше 5 в окрестности), лисы больше не появляются. Если кроликов больше лис, то лис ест кролика.

        12. Создать абстрактный базовый класс с виртуальной функцией - корни уравнения. Создать производные классы: класс линейных уравнений и класс квадратных уравнений. Определить функцию вычисления корней уравнений.

        13. Создать класс комната, имеющая площадь. Определить конструктор и метод доступа. Создать класс однокомнатных квартира, содержащий комнату и кухню (ее площадь), этаж (комната содержится в классе однокомнатная квартира). Определить конструкторы, методы доступа. Определить производный класс однокомнатных квартир разных городов ( дополнительный параметр - название города). Определить конструкторы, деструктор и функцию печати.

        14. Создать класс хвост, имеющий длину. Определить конструкторы и метод доступа. Создать класс собачьих, содержащий класс хвост. Дополнительно есть цвет (указатель на строку), возраст. Определить конструкторы и деструктор. Определить производный класс собака, имеющий дополнительно кличку(указатель на строку). Определить конструкторы, деструкторы и функцию печати.

        15. Создать класс двигатель, имеющий мощность. Определить конструкторы и метод доступа Создать класс машин, содержащий класс двигатель. Дополнительно есть марка (указатель на строку), цена. Определить конструкторы и деструктор. Определить производный класс грузовик, имеющий дополнительно грузоподъемность. Определить конструкторы, деструкторы и функцию печати.

        16. Создать класс жесткий диск, имеющий объем (Мбайт). Определить конструкторы и метод доступа. Создать класс компьютер, содержащий класс жесткий диск. Дополнительно есть марка (указатель на строку), цена. Определить конструкторы и деструктор. Определить производный класс компьютеров с монитором, имеющий дополнительно размер монитора. Определит конструкторы, деструкторы и функцию печати.

        17. Создать класс процессор, имеющий мощность (МГц). Определить конструкторы и метод доступа. Создать класс компьютер, содержащий класс процессор. Дополнительно есть марка (указатель на строку), цена. Определить конструкторы и деструктор. Определить производный класс компьютеров с монитором, имеющий дополнительно размер монитора. Определит конструкторы, деструкторы и функцию печати.

        18. Создать класс колесо, имеющий радиус. Определить конструкторы и метод доступа. Создать класс машин, содержащий класс колесо. Дополнительно есть марка (указатель на строку), цена. Определить конструкторы и деструктор. Определить производный класс грузовик, имеющий дополнительно грузоподъемность. Определить конструкторы, деструкторы и функцию печати.