SLC S22 Week3 || Inheritance and Polymorphism in JAVA
Як же я не любив ці класи((
Спочатку в мові С були структури, вони містили змінні - поля структури(або члени-дані структури). Я пояснюю структури протиставляючи їм масиви. Масив це об'єднання змінних і структура це об'єднання змінних. Але в масиві всі вони одного типу і пронумеровані, а в структурах вони різного типу і проіменовані.
Ну а з появою класів - це структури з функціями всередині структури. Тут було все просто))
Та з'явилася ця спадковість. Виявляється одні класи можна описувати розширюючи(доповнюючи) інші. Але і тут все ще не так складно - не так складно тепер. А на початку було не легко.
Отже домашня робота на
Завдання 1
Напишіть програму на Java, яка створює Person клас з атрибутами name та age. Потім створіть Student клас, який успадковує Person та додає атрибут studentId. Продемонструйте, як створювати об’єкти обох класів і відображати їхні деталі.
І як же обійтися без Аліси та Боба, коли навіть в книжці про Біткоїн Аліса та Боб передають одне одному по 5BTC - ех, були колись часи...
В цьому завданні я створив два різні методи виводу інформації, адже перевантаження і перевизначення є в наступних завданнях. Хоча метод дочірнього класу викликає метод батьківського класу для друку інформації
Завдання 2
Створіть Shapeклас із перевантаженими методами area()для обчислення площі різних фігур (кола, прямокутника та трикутника) на основі наданих параметрів.
Як же в мові С не вистачає перевантаження... і який гарний був винахід розрізняти функції не лише за іменем, а й за кількістю та типом параметрів. Як кажуть у нас про щось незмінне - area() вона й в Африці area(). А без перевантаження довелося б робити різні імена для схожих за дією функцій.
В класі Shape я зробив три методи area() з однаковим іменем, але з різною кількістю параметрів. Один параметр для кола, два для прямокутника і три для трикутника.
В мовах Java/C# функція(метод) не може існувати сам по собі і тому його змушені вкладати в клас. Мені дуже важко це дається, набагато зручніше було б просто три методи зробити без упаковки в клас))) Але те що зараз здається зайвим і недоречним потім колись коли вивчиш всю мову ООП вже не буде здаватися дивним.
В програмі створюємо екземпляр класу Shape shape = new Shape();
Але все рівно ехом лунають запитання, там же даних немає, одні методи, для чого створювати екземпляр.
Shape shape2 = new Shape();
а якщо я створю ще один екземпляр, що зміниться. Це все схоже на дитячі питання чому дме вітер, або чому вода мокра))
Далі викликаємо shape.area(42.0)
...shape.area(11.0, 7.0)
.... shape.area(13.0, 14.0, 11.0)
...
І ніби одна і та функція...а по факту викликаються різні - це і є поліморфізм. Так, перевантаження це як поліморфізм, його примітивна версія. А в класах поліморфізм ще більше розкриває свою суть.
Метод можна було викликати так:
'double circleArea = new Shape().area(42.0);'
або навіть так якщо метод оголосити статичним
'double circleArea = Shape.area(42.0);'
- я знову це зрозумів, адже я не користуюся і не знаю Java/C#
Завдання 3
Розробити Bank клас за допомогою методу getInterestRate(). Створіть два похідних класи SavingsBank, CurrentBank які замінять getInterestRate() метод для повернення певних ставок. Напишіть програму для відображення процентних ставок для обох типів банків.
Це завдання ніби і схоже на попереднє, але відмінність в тому, що функції які хоч і мають однакові імена, проте вони належать до різних класів. І сигнатури обох методів співпадають, тому це перевизначення, а не перевантаження.
Завдання 4
Створіть ієрархію класів із базовим класом Vehicle і похідними класами Bike та Truck. Реалізуйте метод startEngine() у базовому класі та замініть його в похідних класах, щоб відображати певні повідомлення. Використовуйте поліморфізм для виклику методів через посилання на базовий клас.
Завдання схоже на попереднє, але ми оголошуємо змінну батьківського класу, яка може набувати значень дочірніх. Але не навпаки. Роза це квітка, але квітка не є роза.
Завдання 5
Створіть систему управління бібліотекою , яка використовує успадкування та поліморфізм. Створіть базовий клас Item з атрибутами id, title і isAvailable. Розширите його на похідні класи Book з Magazine додатковими атрибутами. Застосовуйте поліморфні методи для запозичення та повернення предметів і відображення їх деталей.
Створено клас Item, базовий/батьківський як спільний для Книг та Журналів
Спільні атрибути перенесено в цей базовий клас.
В клас Книга додали автора книги, а в клас Журнал - додали номер.
і для книги і для журналу викликається один і той же метод, насправді завдяки поліморфізму то різні методи, але записуються вони однаково. І все виглядає так ніби то один метод. і користуватися у такий спосіб методами значно легше.
Завдання 6
Система управління персоналом:
Організація наймає працівників трьох типів: найнятих за контрактом, постійних працівників і погодинних працівників. Відстежуються такі дані:
Співробітники за контрактом: отримують фіксовану місячну зарплату.
Постійні працівники: отримують базову заробітну плату плюс надбавку за продуктивність.
Почасові працівники: оплачуються відповідно до кількості відпрацьованих годин і погодинної ставки.
Завдання:
Розробіть ієрархію класів для представлення зв’язку між Employee, HourlyWorker, ContractualEmployeeта PermanentEmployee. Вкажіть атрибути та методи.
Визначте базовий клас за допомогою таких атрибутів , Employeeяк , , і та метод .nameCINaddresssalarydisplay()
Визначте похідні класи, щоб включити певні атрибути для розрахунку зарплати, calculateSalary()метод і display()метод.
У основній програмі створіть вектор для трьох співробітників різних типів і відобразіть їхні дані.
used draw.io
Робимо базовий клас Employee
в який виносимо спільні атрибути/методи
Для співробітників за контрактом додаймо атрибут місячної зарплатні. Та перевизначимо метод обчислення зарплатні
Постійним робітникам додаємо два атрибути: заробітну плату та бонус до неї і перевизначимо метод обчислення зарплатні
У погодинних працівників
Завдання 7
Розуміння класових відносин:
Враховуючи наступні визначення класів, проаналізуйте, чи дійсні інструкції з 1 по 8 у методі. Якщо помилка недійсна, укажіть, чи виникає помилка під час компіляції чи виконання.
class Test {
public static void main(String args[]) {
C1 o1 = new C1();
C1 o2 = new C11();
C111 o3 = new C111();
C11 o4 = new C111();
C1 o5 = new C111();
o1 = o2; // Instruction 1
o1 = o3; // Instruction 2
o3 = o1; // Instruction 3
o4 = o5; // Instruction 4
o3 = (C111) o1; // Instruction 5
o4 = (C11) o5; // Instruction 6
o4 = (C111) o2; // Instruction 7
o3 = (C11) o5; // Instruction 8
}
}
class C1 {}
class C11 extends C1 {}
class C111 extends C11 {}
Напишу схематично так C1 <= C11 <= C111. Тобто меншому(батьківському) можна присвоїти більший дочірній.
Етап компіляції
Instruction 1 - можлива o1(C1) <= o2(C11)
Instruction 2 - можлива o2(C1) <= o3(C111)
Instruction 3 - неможлива o3(C111) > o1(C1)
Instruction 4 - неможлива o4(C11) > o5(C1), не можна конвертувати С1 в С11
Instruction 5 - можлива o3(С111) <= (C111) o1
Instruction 6 - можлива o4(C11) <= (C11) o5
Instruction 7 - можлива o4(C11) <= (C111) o2
Instruction 8 - неможливо o3 = (C11) o5; праворуч буде С11, яке не можна записати в о3 С111
Після компіляції, при запуску
Instruction 7 - неможлива o4(C11) <= (C111) o2
Якби о2 була по факту С111 наприклад ось так C1 o2 = new C111();
- то тоді помилки не було б
Завдання 8:
Геометричне успадкування:
Створіть Point клас з атрибутами x(абсциса) і y(ордината). Включіть конструктори Point() та Point(x, y). Додайте геттери, сетери та toString() метод.
Створіть Rectangle клас, який успадковує Point з атрибутами length та width. Включіть конструктори Rectangle()та Rectangle(x, y, length, width). Додайте геттери, сетери та методи area()(обчислення площі) і toString()(перевизначення).
Створіть Parallelogram клас, який успадковує Rectangle з додатковим атрибутом height. Включіть конструктори Parallelogram()та Parallelogram(x, y, length, width, height). Додайте геттери, сетери та методи area()(перевизначення), volume() і toString()(перевизначення).
Напишіть тестовий клас, щоб продемонструвати функціональність усіх трьох класів.
Намагався зобразити відношення класів) ...
Спочатку робимо базовий клас Point
Я відомо у всього є батьківський клас Object, тому перевизначаємо метод toString()
Далі на базі класу Point робимо клас Rectangle
x,y,setX(),getX(),setY(), getY() успадкувалися від батьківського Point - довжину ширину необхідні методи додаємо до класу.
А додавши третій вимір - висоту одержимо паралелепіпед. Додавання нового атрибуту вимагає додавання ще трьох методів, геттера/сеттера висоти та обчислення об'єму.
Спочатку створюємо точку(p), та виводимо її характеристики.
Далі створюємо паралелограм(rect). виводимо його характеристики, та обчислюємо площу.
Те ж саме з паралелепіпедом + виводимо об'єм.
Під кінець програми я змінну p типу Point прив'язую послідовно до прямокутника та паралелепіпеда і виводжу їх інформацію - поліморфізм працює)))