Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Fiat500. Moveto(35, 120);

Public double f(double x) | Abstract void voice(); | КОНСТРУКТОРИ КЛАСУ | Private static int number; | Return new Complex(x - z.x, y - z.y); | ЛАБОРАТОРНЕ ЗАВДАННЯ |


 

Текстовий рядок в лапках вважається в Java об’єктом класу String. Тому можна написати: int strlen = "Це об’єкт класу String".length();

Об’єкт "рядок" виконує метод length(), один із методів свого класу String, який підраховує кількість символів у рядку. У результаті одержимо значення strlen, яке дорівнює 21.

2.1.2. Ієрархія

Ієрархія об’єктів давно використовується для їх класифікації. Особливо детально вона опрацьована у біології. Всі знайомі з сімействами, родами і видами. Ми можемо зробити опис своїх домашніх тварин (pets): кішок (cats), собак (dogs), корів (cows) та інших наступним чином:

class Pet{ // Тут описуємо спільні властивості всіх домашніх тварин

Master person; // Господар тварини

int weight, age, eatTime; // Вага, вік, час годування

int eat(int food, int drink, int time){ // Процес годування

// Початкові дії...

if (time == eatTime) person.getFood(food, drink);

// Метод приймання їжі

}

void voice(); // Звуки, які видають тварини

// Інше...

}

 

Потім створюємо класи, які описують конкретніші об’єкти, зв’язуючи їх із спільним класом:

 

class Cat extends Pet{ // Описуються властивості, властиві лише кішкам:

int mouseCatched; // кількість спійманих мишей

void toMouse(); // процес ловіння мишей

// інші властивості

}

class Dog extends Pet{ // Властивості собак:

void preserve(); // охороняти

}

 

Зверніть увагу, що ми не повторюємо спільні властивості, описані у класі Pet. Вони наслідуються автоматично. Ми можемо визначити об’єкт класу Dog і використовувати у ньому всі властивості класу Pet так, ніби вони описані у класі Dog:

Dog Brovko = new Dog(), Artur = new Dog();

Після такого визначення можна буде написати

Brovko.age = 3;

int p = Artur.eat (30, 10, 12);

 

А класифікацію продовжити таким чином:

class Pointer extends Dog{... } // Властивості породи пойнтер

class Setter extends Dog{... } // Властивості сеттерів

 

Зверніть увагу, що на кожному наступному рівні ієрархії у клас додаються нові властивості, але жодна властивість не пропадає. Тому використовується слово extends — "розширює" і говорять, що клас Dog — розширення (extension) класу Pet. З іншої сторони, кількість об’єктів при цьому зменшується: собак менше, ніж всіх домашніх тварин. Тому часто говорять, що клас Dog — підклас (subclass) класу Pet, а клас Pet — суперклас (superclass) класу Dog.

Часто використовують генеалогічну термінологію: батьківський клас, дочірний клас, клас-нащадок, клас-предок.

У цій термінології говорять про наслідування (inheritance) класів, у нашому прикладі клас Dog наслідує клас Pet.

Опишемо господаря тварини у класі Master:

class Master{ // Власник тварини

String name; // Прізвище, ім’я

// Інші дані

void getFood(int food, int drink); // Годівля

// Інше

}

 

Господар і його домашні тварини постійно контактують. Їх взаємодія виражається дієсловами "гуляти", "годувати", "охороняти", "чистити", "ластитися", "проситися" та іншими. Для опису взаємодії об’єктів застосовується третій принцип об’єктно-орієнтованого програмування — обов’язок або відповідальність.

2.1.3. Відповідальність

У нашому прикладі розглядається тільки взаємодія у процесі годування, яка описується методом eat(). У цьому методі тварина звертається до господаря, вмоляючи його застосувати метод getFood(). В англомовній літературі подібне звернення описується словом message "повідомлення". Чому не використовується словосполучення "виклик методу", адже говорять: "Виклик процедури"? Тому що між цими поняттями існує, принаймні, три відмінності.

· Повідомлення іде до конкретного об’єкта, що знає метод розв’язання задачі, у прикладі цей об’єкт — біжуче значення змінної person. У кожного об’єкта є свій біжучий стан, свої значення полів класу, і це може вплинути на виконання метод.

· Спосіб виконання доручення, що міститься в повідомленні, залежить від об’єкта, якому воно адресоване. Один госодар поставить миску з "Chappi", другий кине кістку, третій вижене собаку на вулицю. Цю цікаву властивість називають поліморфізмом (polymorphism).

· Звернення до методу відбудеться лише на етапі виконання програми, компілятор нічого не знає про метод. Це називається "пізнім зв’язуванням" напротивагу "ранньому зв’язуванню", при якому процедура приєднується до програми на етапі компонування.

Отже, обєкт Brovko, виконуючи свій метод eat(), посилає повідомлення об’єкту, посилання на який міститься у змінній person, із проханням видати йому певну кількість їжі і води. Повідомлення записане у рядку person.getFood(food, drink).

Цим повідомленням заключається контракт (contract) між об’єктами, суть якого у тому, що об’єкт Brovko бере на себя відповідальність (responsibility) задати правильні параметри в повідомленні, а об’єкт — біжуче значення person — бере на себе відповідальність застосувати метод годівлі getFood(), яким би він не був.

Для того, щоб правильно реалізувати принцип відповідальності, застосовується четвертий принцип об’єктно-орієнтованого програмування — модульність (modularity).

2.1.4. Модульність

Цей принцип стверджує — кожний клас повинен складати окремий модуль. Члени класу, до яких не планується звертання зовні, повинні бути інкапсульовані. В мові Java інкапсуляция досягається додаванням модифікатора private до опису члена класу. Наприклад:

 


Дата добавления: 2015-11-14; просмотров: 53 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Car alfaRomeo156, fordFocus, fiat500;| Protected Master person;

mybiblioteka.su - 2015-2024 год. (0.006 сек.)