Отношения между классами (объектами)

По моей практике преподавания вопрос отношений между классами (или объектами) почему-то вызывает проблемы. Из-за чего так происходит, не могу сказать. Когда я изучал ООП, мне это показалось настолько очевидным, что не стоило даже упоминания — вся логика ООП не просто кричит, она вопиет об очевидности таких отношений и правилах их построения. Но тем не менее этот вопрос часто требует объяснений. Чем мы сейчас и займемся, прежде чем продолжим изучение новых конструкций языка Java.

Теоия ООП выделяет три основных отношения между классами:

  1. Ассоциация
  2. Агрегация и композиция
  3. Обобщение/Расширение (наследование)

Последний пункт мы с вами уже рассматривали, так что сосредоточимся на первых двух.

 

Ассоциация

Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Например Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример — Преподаватель и Студент — т.е. какой-то Студент учится у какого-то Преподавателя. Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя. Идея достаточно простая — два объекта могут быть связаны между собой и это надо как-то описать.

Агрегация и композиция

Агрегация и композиция на самом деле являются частными случаями ассоциации. Это более конкретизированные отношения между объектами.
Агрегация — отношение когда один объект является частью другого. Например Студент входит в Группу любителей физики.
Композиция — еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Например Машина и Двигатель. Хотя двигатель может быть и без машины, но он вряд ли сможет быть в двух или трех машинах одновременно. В отличии от студента, который может входить и в другие группы тоже. Такие описания всегда несколько условны, но тем не менее.

Техническая реализация

На самом деле каких-либо сложных и высокоумных технических решений нет — все достаточно тривиально. В одном классе делается ссылка на другой и наоборот (не всегда). Дальше идет развитие данной идеи в зависимости например от количества связей. В машине четыре колеса и она имеет связь со всеми — значит в машине будет ссылка на список колес (или массив). Давайте соединим нашего робота с оператором, который им управляет. Между ними можно установить ассоциацию через ссылки в одном классе на другой класс. Т.е. класс Robot имеет ссылку на класс Operator и наоборот — класс Operator имеет ссылку на класс Robot.

Класс Robot

Класс Operator

Чего-то другого человечество пока не придумало. Как я уже упоминал, можно несколько разнообразить виды ссылок, но идея останется прежней. Можно делать ссылки только в одном классе — тогда связь будет односторонняя, может быть несколько ссылок или ссылка на список (массив). Но все равно сказать одному классу, что он связан с другим можно только по такому принципу.
Кстати, когда мы размещали наши компоненты с овалом, прямоугольником на форме, то тут можно говорить о композиции — форма содержит внутри себя список компонентов класса JComponent для хранения всех компонентов, которые ей передают.

Еще один способ взаимодействия объектов

Эта ситуация возникает тогда, когда постоянной связи между объектами не предусматривается вообще, но какие-то данные надо передать от одного другому. Можно воспользоваться вариантом передачи объекта прямо в методе. Например, наш робот может иметь метод, который принимает данные из другого робота — его координаты — для того, чтобы туда переместиться. Значит надо сделать метод, который в качестве параметра будет иметь объект класса Robot.
Как видите все достаточно банально и просто. Мы очень скоро столкнемся с этими понятиями при рассмотрении примеров.

И теперь нас ждет следующая статья: Визуализация робота.