Наслідування. Створення та використання ієрархії класів
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет
"Львівська політехніка"
Інститут післядипломної
освіти
ЗВІТ
Про виконання лабораторної
роботи
з дисципліни
«Об’єктно-орієнтоване програмування»
«Наслідування. Створення
та використання ієрархії класів»
Виконав:
слухач групи ПЗС-11
Гринчук Тарас
Прийняла:
доц. Кортєєва Т.О.
Львів 2014
1.
Завдання
Розробити ієрархію класів згідно отриманого завдання та
описати їх алгоритмічною мовою С++. Використати абстрактні класи і віртуальні функції.
Написати фрагмент програми з використанням об’єктів створених класових типів.
Варіант 5. Побутові прилади: пральна машина, пилосос, телевізор,
магнітофон, радіоприймач, музичний центр.
2.
Структурна схема ієрархії класів
Рис. 2.1. Структурна схема ієрархії класів
3. Текст програми на мові програмування Java
/**
* Л/р №3 (варіант 5)
* Наслідування. Створення та використання ієрархії класів.
* @author Taras
*/lab3_oop;java.util.*;
/*
--------------------------------------------------------------------------
* клас Лічильник електроенергії - підраховує к-сть
використаних кВт*год
* при роботі електропристроїв, в залежності від часу роботи
* та їх потужності.
* Клас має лише один екземпляр і створюється "на
вимогу", реалізовано на базі
* патерна Одинак (Singleton)
*/ElectricityCounter {static ElectricityCounter value() {ec;
}
//збільшення лічильникаvoid add(double kilowatts, double
hours) {+= kilowatts * hours;
}
//показати поточний станdouble indicate() {kilowattHours;
}double kilowattHours = 0;
//приватний конструктор, екземпляр створюється тільки через
статичний викликElectricityCounter() {}static ElectricityCounter ec = new
ElectricityCounter();
}
/* --------------------------------------------------------------------------
* клас Мотор - входить у склад кожного Побутового пристрою
*/Engine {
//потужністьdouble power;
//конструкторEngine(double power) {.power = power;
}
//запускvoid start() {.out.println("Start
engine...");
}
//припинення роботиvoid stop() {.out.print("Stop
engine.");
}
}
/*
--------------------------------------------------------------------------
* абстрактний клас Побутових пристроїв - батьківський для
всіх інших
*/class Appliance {
//поля-характеристикиString type; //типString manufacturer;
//виробникString model; //модельEngine eng; //мотор
//конструкторAppliance(double power, String type, String
manufacturer, String model) {= new Engine(power);.type = type;.manufacturer =
manufacturer;.model = model;
}
//перевизначення стандартного методу Object.toString() -
використовуємо
//для виведення на екран назви об'єкту з його
характеристиками
@OverrideString toString() {type + ": " +
manufacturer + " " + model + " / " + eng.power + "
kWt";
}
//запуск пристроюvoid start() {.start();
}
//вимкнення пристроюvoid stop(double hours)
{.stop();.out.println(" Time of work: " + hours + "
hours.");.value().add(eng.power, hours);
}
//абстрактний (віртуальний) метод. Реалізований для кожного
виду
//побутового пристрою по-різномуvoid work();
}
/*
-------------------------------------------------------------------------
* клас Сервісні прилади - дочірній до Побутових пристроїв
* використовується для розширення інтерфейсу батьківського
класу
*/class ServiceEquipment extends Appliance {
//конструкторServiceEquipment(double power, String type,
String manufacturer, String model) {
//виклик конструктора батьківського класу(power, type,
manufacturer, model);
//"Очистка приладу після роботи"
//абстрактний (віртуальний) метод, для кожного конкретного
виду
//сервісної техніки, передбачено своя реалізація цього
методуvoid CleanItself();
}
/*
--------------------------------------------------------------------------
* клас Інформаційна(розважальна) техніка - дочірній до
Побутових пристроїв
* використовується для розширення інтерфейсу батьківського
класу
*/class Informational Technics extends Appliance {
//рівень звукуint volumeLevel;
//конструкторInformational Technics(double power, String
type, String manufacturer, String model) {
//виклик конструктора батьківського класу(power, type,
manufacturer, model);
//початкове значення рівня звуку= 10;
}
//встановлення рівня звукуvoid setVolumeLevel(int
volumeLevel) {.volumeLevel = volumeLevel;
}
}
/* --------------------------------------------------------------------------
* клас Пральна машина - дочірній до Сервісних приладів
*/WashingMachine extends ServiceEquipment {
//місткість баку з водоюint waterTankCapacity;
//конструкторWashingMachine(double power, String
manufacturer, String model, int waterTankCapacity) {
//виклик конструктора батьківського класу(power,
"Washing machine", manufacturer, model);.waterTankCapacity =
waterTankCapacity;
}
//до батьківського представлення назви додамо ще місткість
баку
@OverrideString toString() {super.toString() + " /
" + waterTankCapacity + " Liters";
}
//пранняvoid wash() {.out.println("Washing...");
}
//викручуванняvoid squeeze()
{.out.println("Squeezing...");
}
//реалізація віртуального методу класу Побутових пристроїв
@Overridevoid work() {();();
}
//реалізація віртуального методу класу Сервісних приладів
@Overridevoid CleanItself() {
//очистка баку з водою.out.println("Cleaning water from
the tank.");
}
}
/*
--------------------------------------------------------------------------
* клас Пилосос - дочірній до Сервісних приладів
*/VacuumCleaner extends ServiceEquipment{
//довжина шлангуint cordLength;
//конструкторVacuumCleaner(double power, String manufacturer,
String model, int cordLength) {
//виклик конструктора батьківського класу(power, "Vacuum
cleaner", manufacturer, model);.cordLength = cordLength;
}
//до батьківського представлення назви додамо ще довжину
шлангу
@OverrideString toString() {super.toString() + " /
" + cordLength + " meters";
}
//метод "пилососити"void clean()
{.out.println("Cleaning...");
}
//реалізація віртуального методу класу Побутових пристроїв
@Overridevoid work() {();
}
//реалізація віртуального методу класу Сервісних приладів
@Overridevoid CleanItself() {
//очистити мішок з сміттям.out.println("Cleaning garbage
collector.");
}
}
/*
--------------------------------------------------------------------------
* клас Радіо - дочірній до Інформаційної техніки
*/Radio extends InformationalTechnics {
//діапазон хвильString frequencyRange;
//конструкторRadio(double power, String manufacturer, String
model, String frequencyRange) {
//виклик конструктора батьківського класу(power,
"Radio", manufacturer, model);.frequencyRange = frequencyRange;
}
//до батьківського представлення назви додамо ще діапазон хвиль
@OverrideString toString() {super.toString() + " /
" + frequencyRange;
}
//програвати радіохвилюvoid playRadio()
{.out.println("Playing radio...");
}
@Overridevoid work() {();
}
}
/* --------------------------------------------------------------------------
* клас Телевізор - дочірній до Інформаційної техніки
*/TV extends InformationalTechnics {
//довжина діагоналі в дюймахint diagonal;
//конструкторTV(double power, String manufacturer, String model,
int diagonal) {
//виклик конструктора батьківського класу(power,
"TV-set", manufacturer, model);.diagonal = diagonal;
}
//до батьківського представлення назви додамо ще довжину
діагоналі
@OverrideString toString() {super.toString() + " /
" + diagonal + " inch";
}
//показати телеканалvoid playTV() {.out.println("Playing
TV channel...");
}
//телетекстvoid displayTeleText()
{.out.println("Displaying teletext...");
}
//реалізація віртуального методу класу Побутових пристроїв
@Overridevoid work() {();();
}
}
/*
--------------------------------------------------------------------------
* клас Магнітофон - дочірній до Радіо
*/TapeRecorder extends Radio {
//кількість касетниківint cassetteNumber;
//конструкторTapeRecorder(double power, String manufacturer,
String model,String frequencyRange, int cassetteNumber) {
//виклик конструктора батьківського класу(power,
manufacturer, model, frequencyRange);
//переприсвоїмо тип на потрібний= "Tape
recorder";.cassetteNumber = cassetteNumber;
}
//до батьківського представлення назви додамо ще кількість
касетників
@OverrideString toString() {super.toString() + " /
" + cassetteNumber + " tape(s)";
}
//програвати запис на касетіvoid playTapes()
{.out.println("Playing tapes...");
}
//реалізація віртуального методу класу Побутових пристроїв
@Overridevoid work() {
//спочатку запустимо батьківський функціонал.work();();
}
}
/*
--------------------------------------------------------------------------
* клас Музичний центр - дочірній до Магнітофон
*/StereoSystem extends TapeRecorder {
//кількість слотів для дисківint cdNumber;
//конструкторStereoSystem(double power, String manufacturer,
String model, String frequencyRange, int cassetteNumber,cdNumber) {
//виклик конструктора батьківського класу(power,
manufacturer, model, frequencyRange, cassetteNumber);
//переприсвоїмо тип на потрібний= "Stereo
system";.cdNumber = cdNumber;
}
//до батьківського представлення назви додамо ще кількість
СD-слотів
@OverrideString toString() {super.toString() + " /
" + cdNumber + " cd's";
}
//програвати CD-дискvoid playCD() {.out.println("Playing
cd's...");
}
//реалізація віртуального методу класу Побутових пристроїв
@Overridevoid work() {
//спочатку запустимо батьківський функціонал.work();();
}
}
/* ===================================================
* головний клас пакету
*/class Lab3_OOP {static void main(String[] args) {
//Створення масиву Побутових пристроїв[] app =
{WashingMachine(0.95, "Bosch", "WAB 20071 CE",
42),VacuumCleaner(0.25, "Philips", "FC 9174",
9),Radio(0.01, "LG", "SP820", "AM+FM"),TV(0.1,
"Sony", "KDL-42W807", 42),TapeRecorder(0.05,
"Pioneer", "BDP-150", "FM", 2),StereoSystem(0.12,
"Sharp", "GX-M10HOR", "AM+FM", 1, 4)
};
//отримання випадкових значень для вказання часу роботи
пристроївc = Calendar.getInstance();rand = new Random(c.getTimeInMillis());
//обхід масиву пристроїв(Appliance a : app)
{.out.println("=====================================");.out.println(a);
//включимо пристрій.start();
//протестуємо весь функціонал пристрою.work();
//зупиняємо
//після проходження випадкової к-сті годин в рамках
доби.stop(rand.nextInt(24) + 1);
//якщо пристрій належить до гілки Сервісних,
//очистимо його після роботи(a instanceof ServiceEquipment)
//виведемо поточний стан індикатора лічильника
електроенергії.out.println("----------------------------------------");.out.println("Electricity
counter: "
+ ElectricityCounter.value().indicate() + "
kWt*hrs");
}
}
}
4. Результат виконання програми
ієрархія клас побутовий програмування
Запустимо програму на виконання (рис. 4.1).
В результаті бачимо протокол роботи різних електричних
пристроїв і збільшення показника електролічильника відсортовані, внаслідок
цього.
Рис. 4.1. Результат виконання програми
5. Висновки
На даній лабораторній роботі я навчився створювати ієрархічні
структури класів, використовувати наслідування для написання ефективних програм
на Java. Також вивчив особливості роботи з абстрактними класами та функціями,
застосовуванню поліморфізму у прикладних задачах.