3.35M
Category: programmingprogramming

Композиция. Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов. Расширение поведения без наследования

1.

Панов Михаил Александрович
к.э.н., доцент кафедры информационных технологий и статистики «УрГЭУ»
[email protected]

2.

Композиция
Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

3.

Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

4.

Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

5.

Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

6.

Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

7.

Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

8.

Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.

9.

Наследование в Java и его преимущества
Как вы наверняка помните, наследование
(inheritance)

механизм,
который
позволяет описать новый класс на основе
существующего (родительского). При этом
свойства
и
функциональность
родительского класса заимствуются новым
классом. Давайте вспомним пример
наследования из предыдущих лекций:
Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов.
Расширение поведения без наследования.

10.

Есть некая программа, в рамках которой мы работаем с различными типами автомобилей.
Даже если ты не автолюбитель, наверняка знаешь, что типов этих самых автомобилей на свете великое
множество :)
Поэтому общие свойства автомобилей выделяем в общий класс-родитель — Car. А что общего у всех
автомобилей вне зависимости от типа? У любой машины есть год выпуска, название модели и максимальная
скорость. Эти свойства выносим в поля model, maxSpeed, yearOfManufacture.
Что касается поведения, любая машина может газовать и тормозить :)
Это поведение мы определяем в методах gas() и brake(). Какие выгоды это нам дает? Прежде всего —
сокращение объема кода. Конечно, можем обойтись и без родительского класса. Но поскольку каждая машина
должна уметь газовать и тормозить, нам придется создавать методы gas() и brake() в классе Truck, в классе
Sedan, в классе F1Car, в классе Sportcar и во всех остальных классах машин. Представь, сколько лишнего кода
мы при этом напишем. Не забывай и о полях model, maxSpeed и yearOfManufacture: если откажемся от
родительского класса, будем создавать их в каждом из классов-машин!
Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов.
Расширение поведения без наследования.

11.

Когда у нас наберется пара десятков классов-машин, объем повторяющегося кода станет действительно
серьезным. Вынесение общих полей и методов (еще говорят — «состояния» и «поведения») в классродитель позволит нам сэкономить кучу времени и места. Если же у какого-то типа есть свойства или
методы, уникальные только для него и отсутствующие у других типов машин, — не беда. Их всегда
можно создать в классе-потомке, отдельно от всех остальных.
Возьмем случай с гоночными
машинами Формулы-1. У них, в
отличие от «сородичей», есть
уникальное поведение — время от
времени они заезжают на пит-стоп.
Нам это не мешает. Общее
поведение мы уже описали в
родительском
классе
Car,
а
специфическое поведение классовпотомков можем добавить внутри
классов.
Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов.
Расширение поведения без наследования.

12.

Это касается и полей: если у дочернего класса есть уникальные свойства, спокойно объявляем эти поля
внутри него и не переживаем :)
Возможность повторного использования кода — главное преимущество наследования.
Для программиста очень важно не писать лишний объем кода. Вы не раз столкнетесь с этим в работе.
Пожалуйста, запомните еще одну крайне важную вещь: в Java нет множественного наследования. Каждый
класс наследуется только от одного класса. О причинах этого подробнее поговорим в будущих лекциях, пока
просто запомни. Этим Java, кстати, отличается от некоторых других ООП-языков.
Например, в С++ множественное наследование есть.
Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов.
Расширение поведения без наследования.

13.

Композиция и агрегирование
Классы и объекты могут быть связаны друг с другом. Наследование описывает связь «является» (или поанглийски «IS A»). Лев является Животным. Такое отношение легко выразить с помощью наследования, где
Animal будет родительским классом, а Lion — потомком.
Однако не все связи отношения в мире описываются таким образом. К примеру, клавиатура определенно
как-то связана с компьютером, но она не является компьютером.
Руки как-то связаны с человеком, но они не являются человеком. В этих случаях в его основе лежит другой
тип отношения: не «является», а «является частью» («HAS A»). Рука не является человеком, но является
частью человека. Клавиатура не является компьютером, но является частью компьютера. Отношения HAS A
можно описать в коде, используя механизмы композиции и агрегирования. Разница между ними
заключается в «строгости» этих связей. Приведем простой пример: У нас есть наш Car — машина. У каждой
машины есть двигатель. Кроме того, у каждой машины есть пассажиры внутри. В чем же принципиальная
разница между полями Engine engine и Passenger [] passengers? Если у машины внутри сидит пассажир А, это
не значит, что в ней не могут находиться пассажиры B и C. Одна машина может соответствовать нескольким
пассажирам. Кроме того, если всех пассажиров высадить из машины, она продолжит спокойно
функционировать. Связь между классом Car и массивом пассажиров Passenger [] passengers менее строгая.
Она называется агрегацией.
Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов.
Расширение поведения без наследования.

14.

Композиция — более строгий тип связи. При использовании композиции объект не только является частью
какого-то объекта, но и не может принадлежать другому объекту того же типа. Самый простой пример —
двигатель автомобиля. Двигатель является частью автомобиля, но не может быть частью другого
автомобиля. Как видишь, их связь гораздо более строгая, чем у Car и Passengers.
Тема 10. Агрегация и композиция: сложные объекты. Объекты из объектов.
Расширение поведения без наследования.

15.

Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом.
Например Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще
пример — Преподаватель и Студент — т.е. какой-то Студент учится у какого-то Преподавателя. Ассоциация и есть описание
связи между двумя объектами. Студент учится у Преподавателя. Идея достаточно простая — два объекта могут быть связаны
между собой и это надо как-то описать.
Агрегация и композиция
Агрегация и композиция на самом деле являются частными случаями ассоциации. Это более конкретизированные
отношения
между
объектами.
Агрегация — отношение когда один объект является частью другого. Например Студент входит в Группу любителей физики.
Композиция — еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не
может принадлежат еще кому-то. Например Машина и Двигатель. Хотя двигатель может быть и без машины, но он вряд ли
сможет быть в двух или трех машинах одновременно. В отличии от студента, который может входить и в другие группы
тоже. Такие описания всегда несколько условны, но тем не менее.
Техническая реализация. Задание «Робот и Оператор»
На самом деле каких-либо сложных и высокоумных технических решений нет — все достаточно тривиально. В одном классе
делается ссылка на другой и наоборот (не всегда). Дальше идет развитие данной идеи в зависимости например от
количества связей. В машине четыре колеса и она имеет связь со всеми — значит в машине будет ссылка на список колес
(или массив). Давайте соединим нашего робота с оператором, который им управляет. Между ними можно установить
ассоциацию через ссылки в одном классе на другой класс. Т.е. класс Robot имеет ссылку на класс Operator и наоборот —
класс Operator имеет ссылку на класс Robot.
Код задания на следующей странице
Тема 10. Агрегация и композиция: сложные объекты.
Объекты из объектов. Расширение поведения без
наследования.
English     Русский Rules