5

Добрый день читаю Г. Буча и там рассказывается об отношениях между классами. Есть следующие виды отношений: наследование, агрегация, ассоциация, зависимости. Я понимаю как устанавливать отношения между классами с помощью наследования, но на счёт других видов не понимаю как они устанавливаются. Объясните в двух словах как это делается?

  • Композицию пропустили. А вот зависимости - это всё, что угодно) – vp_arth Jul 04 '17 at 12:41
  • https://ru.wikipedia.org/wiki/%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) https://ru.wikipedia.org/wiki/%D0%90%D1%81%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D1%86%D0%B8%D1%8F_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) – Visman Jul 04 '17 at 12:42

2 Answers2

1

Зависимость, это отношение между классами, когда изменения в классе-поставщике могут повлиять на работу зависимого класса, но не наоборот. Например, нашему классу для работы нужна ссылка на объект класса-логгера. В каждом методе он обращается к нему для логирования своих действий. При изменении поведения логгера изменится и поведение зависимого класса, но не наоборот.

Ассоциация классов, это отношение, при котором объект одного класса хранит в себе ссылку на объект другого класса (односторонняя ассоциация) или оба имеют ссылки друг на друга (двусторонняя) или даже коллекции ссылок (ассоциация "один ко многим" и "многие ко многим"). Например, ученик относится к определенной школе, а школа относится к многим ученикам.

Агрегация классов, это отношение целого к частному. Это разновидность ассоциации. Например, автомобиль и его двигатель. Один является контейнером для другого. При уничтожении агрегирующего объекта агрегируемый может быть тоже уничтожен или может быть использован повторно.

Композиция классов это строгий вариант агрегации, когда при уничтожении контейнера содержимое больше не используется нигде и уничтожается либо явно, либо сборщиком мусора.

См Диаграмма классов, Википедия

-3

Мне кажется, что нужно думать не о том, как установить отношения между классами, а нужно думать о том, как оптимальным образом решить поставленную задачу. Вот когда будет в голове спроектирована структура классов и их взаимодействие, тогда все отношения между классами можно будет отобразить в коде и в схемах. Не ставьте телегу впереди лошади.

  • 3
    Что бы решить задачу, надо хорошо изучить предмет, в контексте которого ты работаешь, что бы выбрать в следствии оптимальный вариант. Вот когда будет в голове спроектирована структура классов и их взаимодействие, тогда все отношения между классами можно будет отобразить в коде и в схемах.: Разве парень не пытается разобраться, что бы потом выбрать правильное отношение между классами? Как можно спроектировать структуру классов и их взаимодействий, не понимая типы и их отношений? – Виталик Черный Jan 01 '18 at 03:26
  • Изучать абстрактного коня в вакууме бессмысленно. – Андрей Туманов Jan 02 '18 at 01:25
  • Как можно спроектировать структуру классов и их взаимодействий, не понимая типы и их отношений? – Виталик Черный Jan 02 '18 at 01:26
  • Для того, чтобы спроектировать структуру классов не нужно понимать типы. Чтобы грамотно спроектировать структуру необходимо 1. Знать требования предметной области. 2. Знать возможности языка и среды разработки. 3. Знать и уметь применять ООП. Знать типы необходимо для того, чтобы правильно оформить документацию или рассказать о своих задумках коллегам. А для проектирования эти знания не важны. – Андрей Туманов Jan 02 '18 at 01:37
  • ясно, вы уже и тут на вопрос подобный моему отвечали не правильно – boneferz Dec 29 '18 at 09:35
  • Правильность ответа зависит от поставленных целей. Если цель - изучить программирование "в вакууме" теоретически, то да. Для студентов понимание типов связи необходимо чтобы правильно отвечать на вопросы на семинаре. Для практического программирование знать "названия" типов не обязательно. Для практического программирования гораздо важнее понимание принципов построения программ и опыт в использовании различных способов решения тех или иных задач. Изучайте программирование дальше. Теория очень важна. – Андрей Туманов Jan 03 '19 at 07:21