> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/oop/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/oop/first-term/labs/laboratornaya-rabota-5/zadanie-na-laboratornuyu-rabotu.md).

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

## Задания для выполнения:

### 1. Перегрузка методов

Вернитесь к классу `TimeSpan` из второй лабораторной работы.

Используя механизм перегрузки методов, **допишите или исправьте методы** так, чтобы класс имел следующий функционал:

* конструктор без аргументов (в этом случае временной интервал равен 0 часов и 0 минут);
* конструктор с 1 аргументом (минуты);
* конструктор с 2 аргументами (часы и минуты);
* конструктор с 1 аргументом типа `TimeSpan` (из входящего `TimeSpan` считываются часы и минуты для создания нового `TimeSpan`);
* метод добавления времени ко временному интервалу с 2 аргументами (часы и минуты);
* метод добавления времени ко временному интервалу с 1 аргументом (минуты);
* метод добавления времени ко временному интервалу с 1 аргументом типа `TimeSpan` (из входящего `TimeSpan` считываются часы и минуты для добавления к текущему);
* метод вычитания времени из текущего временного интервала с 2 аргументами (часы и минуты);
* метод вычитания времени из текущего временного интервала с 1 аргументом (минуты);
* метод вычитания времени из текущего временного интервала с 1 аргументом типа `TimeSpan` (из входящего `TimeSpan` считываются часы и минуты для вычитания из текущего).

### 2. Цепочка наследования. В данном задании необходимо выполнить следующие действия:

1\. Создайте класс `Person`, который должен содержать конструктор, геттеры\сеттеры и следующие поля:

* фамилия;
* имя;
* возраст.

Переопределите метод `toString()`, который должен возвращать строку следующего формата:

```
Человек <фамилия> <имя>, возраст: <возраст>
```

2\. Создайте класс `Student`, который должен наследоваться от класса `Person`. Добавьте конструктор, геттеры\сеттеры и следующие поля:

* группа;
* номер студенческого билета.

Переопределите метод `toString()`, который должен возвращать строку следующего формата:

```
Студент группы <группа>, <фамилия> <имя>, возраст: <возраст>. Номер студенческого билета: <номер>
```

3\. Создайте класс `Lecturer`, который должен наследоваться от класса `Person`. Добавьте конструктор, геттеры\сеттеры и следующие поля:

* кафедра;
* зарплата.

Переопределите метод `toString()`, который должен возвращать строку следующего формата:

```
Преподаватель кафедры <кафедра>, <фамилия> <имя>, возраст: <возраст>. Зарплата: <зарплата>
```

4\. Используя восходящее преобразование, создайте в классе `Main` несколько объектов классов `Student` и `Lecturer`, после чего создайте массив, который бы мог включать объекты классов `Person`, `Student`, `Lecturer`. Заполните массив объектами этих классов.

5\. Используя цикл, обратитесь к элементам массива и выведите в консоль, с помощью метода `toString()`, информацию от каждого объекта.

### 3. Задание на простой полиморфизм

В данной задаче мы допишем игру "Камень Ножницы Бяумага".

{% file src="/files/-Ml22dXlpB8OjBtj0xap" %}
Архив с игрой
{% endfile %}

1. Скачайте, распакуйте и откройте проект в IntelliJ IDEA, запустите приложение и изучите исходный код;
2. с помощью механизма полиморфизма создайте классы игровых фигур (Камень, Ножницы, Бумага), которые наследуются от `GameShape`;
3. Напишите логику метода `generateShape()`, который возвращает одну из трех случайных фигур (объект одного из трех классов);
4. в методе `actionPerformed()` допишите создание объекта игровой фигуры в зависимости от того, на какую кнопку нажал пользователь (читайте комментарии внутри метода);
5. реализуйте метод `checkWinner()`, который принимает на вход два объекта игровых фигур - фигура компьютера и игрока. С помощью оператора `instanceof` выясните, фактический объект какого класса скрывается за ссылочной переменной типа `GameShape`. В зависимости от сочетания фигур, метод возвращает: **1 если выиграл игрок**, **-1 если выиграл компьютер** или **0 если ничья**;
6. Сыграйте в игру и убедитесь, что ваш код корректен и игра работает правильно.

### 4. Модификация программы Draw

Скачайте архив с проектом

{% file src="/files/-MkrEo8pQlxmNRB3H3fL" %}
Архив с проектом
{% endfile %}

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

![](/files/-Lq7KfFKAAyXlshP3jNZ)

#### Задание состоит в следующем:

1. Откройте проект, прочитайте комментарии, разберитесь как работает приложение;
2. **Используя механизм полиморфизма**, модифицируйте программу, добавив возможность **выбирать и рисовать эллипсы**;
3. **Задание на дополнительный балл**. Добавьте в программу кнопку **Clear**, по нажатию на которую программа должна стирать все фигуры.

{% hint style="warning" %}
При сдаче лабораторной работы, вы должны быть готовыми показать, где и для каких целей используется полиморфизм и восходящее преобразование.
{% endhint %}
