Иллюстрированный самоучитель по Java

Иерархия


Иерархия объектов давно используете для их классификации. Особенно детально она проработана в биологии. Все знакомы с семействами, родами и видами. Мы можем сделать описание своих домашних животных (pets): кошек (cats), собак (dogs), коров (cows) и прочих следующим образом:

class Pet{     // Здесь описываем общие свойства всех домашних любимцев 

Master person; // Хозяин животного 

int weight, age, eatTimel];             // Вес, возраст, время кормления 

int eat(int food, int drink, int time){ // Процесс кормления

                                        // Начальные действия...

if (time == eatTimefi]) 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 tuzik = new Dog(), sharik = new Dog();

После этого определения можно будет написать

tuzik.age = 3;

int p = sharik.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); // Кормление

              // Прочее 

}

Хозяин и его домашние животные постоянно соприкасаются в жизни. Их взаимодействие выражается глаголами "гулять", "кормить", "охранять", "чистить", "ласкаться", "проситься" и прочими. Для описания взаимодействия объектов применяется третий принцип объектно-ориентированного программирования — обязанность или ответственность.


Содержание раздела