Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Третя лабораторна з ООП

.doc
Скачиваний:
2
Добавлен:
10.12.2018
Размер:
94.72 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Черкаський політехнічний технікум

Звіт

з лабораторної роботи №3

з предмету «об’єктно-орієнтоване програмування»

Виконав:

студент групи ПС3-1

Тараненко О.І.

Перевірив:

Снігур І.В.

Черкаси 2011

Тема: Спадкування. Перевизначення методів. Приведення типу вгору. Поліморфізм.

Мета: Навчитись використовувати спадкування. Навчитись перевизначати методи при спадкуванні. Навчитись використовувати приведення типів об’єктів вгору. Навчитись використовувати поліморфізм.

Завдання: Клавіатура і пристрій з клавішами

Теоретичні відомості

Поліморфізм

Поліморфізм означає залежність поведінки від класу, в якому ця поведінка викликається, тобто, два або більше класів можуть реагувати по різному на однакові повідомлення. Наприклад, якщо Собака отримує команду голос(), то у відповідь можна отримати Гав; якщо Свиня отримує команду голос (), то у відповідь можна отримати Хрю. На практиці - це реалізовується шляхом реалізації ряду підпрограм (функцій, процедур, методи тощо) з однаковими іменами, але з різними параметрами. В залежності від того, що передається і вибирається відповідна підпрограма. Успадкування

Клас може мати «підкласи», спеціалізовані, розширені версії надкласу. Можуть навіть утворюватись цілі дерева успадкування. Наприклад, клас Собака може мати підкласи Коллі, Пікінес, Вівчарка і т.п. Так, Сірко може бути екземпляром класу Вівчарка. Підкласи успадковують атрибути та поведінку своїх батьківських класів, і можуть вводити свої власні. Успадкування може бути одиничне (один безпосередній батьківський клас) та множинне (кілька батьківських класів). Це залежить від вибору програміста, який реалізовує клас та мови програмування. Так, наприклад, в Java дозволене лише одинарне успадкування, а в С++ і те і інше.

Приховування інформації (інкапсуляція)

Приховування деталей про роботу класів від об'єктів, що їх використовують або надсилають їм повідомлення. Так, наприклад, клас Собака має метод гавкати(). Реалізація цього методу описує як саме повинно відбуватись гавкання (приміром, спочатку вдихнути() а потім видихнути() на обраній частоті та гучності). Петро, хазяїн пса Сірка, не повинен знати як він гавкає. Інкапсуляція досягається шляхом вказування, які класи можуть звертатися до членів об'єкта. Як наслідок, кожен об'єкт представляє кожному іншому класу певний інтерфейс — члени, доступні іншим класам. Інкапсуляція потрібна для того, аби запобігти використанню користувачами інтерфейсу тих частин реалізації, які, швидше за все, будуть змінюватись. Це дозволить полегшити внесення змін, тобто, без потреби змінювати і користувачів інтерфейсу. Наприклад, інтерфейс може гарантувати, що щенята можуть додаватись лише до об'єктів класу Собака кодом самого класу. Часто, члени класу позначаються як публічні (англ. public), захищені (англ. protected) та приватні (англ. private), визначаючи, чи доступні вони всім класам, підкласам, або лише до класу в якому їх визначено. Деякі мови програмування йдуть ще далі: Java використовує ключове слово private для обмеження доступу, що буде дозволений лише з методів того самого класу, protected — лише з методів того самого класу і його нащадків та з класів із того ж самого пакету, C# та VB.NET відкривають деякі члени лише для класів із тієї ж збірки шляхом використання ключового слова internal (C#) або Friend (VB.NET), а Eiffel дозволяє вказувати які класи мають доступ до будь-яких членів.

Абстрагування

Спрощення складної дійсності шляхом моделювання класів, що відповідають проблемі, та використання найприйнятнішого рівня деталізації окремих аспектів проблеми. Наприклад Собака Сірко більшу частину часу може розглядатись як Собака, а коли потрібно отримати доступ до інформації специфічної для собак породи коллі — як Коллі і як Тварина (можливо, батьківський клас Собака) при підрахунку тварин Петра.

Розробити два власні класи, що описують певні об’єкти реального світу (конкретні об’єкти для опису вказано нижче у варіантах завдань). Перший з класів повинен спадкуватись від JPanel, а другий – від першого. В кожному з класів повинен бути перевизначений метод paint, в якому промальовується зображення, що відповідає даному класу (зображення може бути абстрактним, в залежності від класу). Перший клас повинен мати не менше 3 власних полів, методи доступу до полів – читання (get-методи) та запису (set-методи), метод виведення інформації про об’єкт (значення полів) на екран, метод введення інформації про об’єкт (значення полів) з клавіатури та не менше двох конструкторів. Другий клас повинен мати не менше двох власних полів та не менше двох конструкторів. Методи виведення інформації про об’єкт та введення інформації про об’єкт першого класу повинні бути перевизначені в другому. Нові методи в другому класі не додаються.

Створити третій клас, який реалізує наступне:

  1. По запиту від користувача визначає клас об’єкту для подальшої роботи (один з двох створених нами, про які йшлося вище) і створює об’єкт даного класу за допомогою new;

  2. Дає можливість провести операції з об’єктом шляхом звернення до методів об’єкту:

а) змінити властивості об’єкту (шляхом виконання відповідного методу даного об’єкту);

б) вивести інформацію про об’єкт (шляхом виконання відповідного методу даного об’єкту);

в) знищити об’єкт і повернутися назад до створення нового об’єкту.

В один момент часу може існувати лише один об’єкт одного з двох створених нами класів.

Код програми

Файл Main.java

import java.awt.Dimension;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import javax.swing.JFrame;

import javax.swing.JButton;

import java.util.Random;

import java.io.*;

public class Main {

static Papers pap = new Papers();

static Book bk = new Book();

static JFrame frame = new JFrame("Тараненко-Продакшн ;)");

private static Random random = new Random();

static int number = 0;

ArrayList list = new ArrayList();

public void add(Papers obj) {

list.add(obj);

}

public void add(Book obj) {

list.add(obj);

}

public void add(JFrame obj) {

list.add(obj);

}

static void addDev1(Papers newspapers) {

if (pap != null) {

pap = null;

pap = newspapers;

}

}

public static void main(String[] args) {

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(500, 500);

frame.setLayout(null);

Main m = new Main();

JButton key = new JButton("Змінити");

int number[]=new int[5];

for(int i=1; i<=3; i++){

do{

number[i]=random.nextInt(3);

}

while(number[i] == number[i-1]);

System.out.println(number[i]+"\n");

if (number[i] == 0) {

m.add(pap);

}

if (number[i] == 1) {

m.add(bk);

}

if (number[i] == 2) {

m.add(frame);

}

}

key.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

int x = 0;

if (pap.getLocation().x == 50) {

x = 10;

} else {

x = 0;

}

frame.remove(pap);

if (x > 0) {

addDev1(new Papers());

} else {

addDev1(new Book());

}

bk.setLocation(new Point(50 + x, 0 + x)); //установка месторасположение фрейма в окне

bk.setSize(300 + x, 300 + x);

frame.getContentPane().add(bk);

frame.repaint();

}

});

pap.setLocation(new Point(50, 0));

pap.setSize(300, 300);

frame.getContentPane().add(pap);

key.setSize(new Dimension(100, 50));

key.setLocation(new Point(200, 300));

frame.getContentPane().add(key);

frame.setVisible(true);

frame.setLocationRelativeTo(null); //установка окна по середине

}

}

Файл Клава.java

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import javax.swing.JPanel;

public class Papers extends JPanel {

private int sizePage;

private String name;

private String author;

private String Ssize = new String();

public Papers() {

sizePage = 101;

name = "keyboard";

author = "2 роки";

Ssize = Integer.toString(sizePage);

}

public Papers(int size, String nam, String auth) {

sizePage = size;

name = nam;

author = auth;

Ssize = Integer.toString(sizePage);

}

public int getSizePage() {

return sizePage;

}

public void setSizePage(int sizePage) {

this.sizePage = sizePage;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

g2.drawRoundRect(20, 70, 340, 200, 20, 15);

g2.drawString("Клавіатура!", 115, 150);

g2.drawString(Ssize, 180, 170);

g2.drawString(name, 180, 190);

g2.drawString(author, 180, 210);

g2.drawString("Кількість клавіш: ", 50, 170);

g2.drawString("З анг: ", 50, 190);

g2.drawString("Гарантія: ", 50, 210);

}

}

Файл Тел.java

import java.awt.Graphics;

import java.awt.Graphics2D;

public class Book extends Papers {

String typeOfBook;

int yearPublication;

String tp = new String();

public Book() {

typeOfBook = "Вони є";

yearPublication = 14;

tp = Integer.toString(yearPublication);

}

public int getYearPublication() {

return yearPublication;

}

public void setYearPublication(int yearPublication) {

this.yearPublication = yearPublication;

}

public String getTypeOfBook() {

return typeOfBook;

}

public void setTypeOfBook(String typeOfBook) {

this.typeOfBook = typeOfBook;

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

g2.drawRoundRect(20, 70, 340, 200, 20, 15);

g2.drawString("Мій телефон!", 150, 150);

g2.drawString("Тип клавіш: ", 115, 170);

g2.drawString("Кількість: ", 115, 190);

g2.drawString(typeOfBook, 230, 170);

g2.drawString(tp, 230, 190);

}

}

Висновок: виконавши лабораторну роботу, я навчився використовувати спадкування. Навчився перевизначати методи при спадкуванні. Навчився використовувати приведення типів об’єктів вгору. Навчився використовувати поліморфізм.