Когда использовать композицию и когда использовать наследование

Есть ли способ сказать, когда использовать композицию и когда использовать наследование в вашем коде.

Пример: допустим, у нас есть 4 класса с именами Computer, MotherBoard, Monitor, Keyboard. Я могу заставить computer наследоваться от трех других классов, а также объявить MotherBoard, Monitor, Keyboard в поле computer, то есть во втором случае использовать композицию. Какой способ лучше? Какой путь предпочитает большинство разработчиков?

Нет никакого установленного правила, это выбор дизайна. В вашем примере наследование не имеет смысла; клавиатура это не компьютер.

Abhijit Sarkar 30.05.2019 21:16

Компьютер состоит (состоит из) других компонентов, так что, надеюсь, очевидно, что композиция здесь является подходящим выбором.

Andy Turner 30.05.2019 21:19

@AndyTurner Я, вероятно, привел неправильный пример, но в целом какой путь предпочтительнее?

Ahmed 30.05.2019 21:21

@ A.Rizgar Плотник предпочитает винты или соединения? Оба являются действительными инструментами, это зависит от ситуации.

Andy Turner 30.05.2019 21:22

Этот вопрос мощь будет закрыт, поскольку он слишком широкий, но ваш вопрос сильно зависит от конкретной ситуации. Вот достойная запись о композиции и наследовании. thinkworks.com/insights/blog/…

hooknc 30.05.2019 21:23

Знакомы ли вы с описаниями это и имеет?

chrylis -cautiouslyoptimistic- 30.05.2019 21:24

@chrylis Да, я знаю эти термины.

Ahmed 30.05.2019 21:24

@hooknc Отличная статья, она ответила на мой вопрос!

Ahmed 30.05.2019 21:29

Клавиатура это компьютер? Нет! У компьютера есть клавиатура. Вот ваш ответ.

Boris the Spider 30.05.2019 21:31

Это слишком широкий и расплывчатый вопрос для SO. Вы погуглили, прежде чем спрашивать - вы бы нашли несколько миллионов просмотров и статей.

Abhijit Sarkar 30.05.2019 21:36

@AbhijitSarkar да, я погуглил, но я хотел обсудить это с людьми и узнать их мнение.

Ahmed 30.05.2019 21:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предпочитаю наследование в случаях следующий:

  • Оба класса находятся в одном логическом домене
  • Подкласс является правильным подтипом суперкласса
  • Реализация суперкласса необходима или подходит для подкласса
  • Улучшения, сделанные подклассом, в основном аддитивны.

В остальном состав соответствующий.

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

  • Является ли ComputerимеютMouse? Если да, то используйте композицию. Обратите внимание, что на компьютере не может быть мыши.
  • ЯвляетсяMacBook а Computer? Если да, то используйте наследование.

... but in general which way is preferred

В общем, решение должно приниматься по ситуации :)

Другие вопросы по теме

Похожие вопросы

Как преобразовать неудачные пакетные результаты API DynamoDB BatchSave в список pojos?
OutOfMemoryError в StringBuilder.append() даже с более чем достаточным объемом памяти
Можете ли вы использовать instanceOf, чтобы определить, является ли объект массивом, а затем выполнить итерацию по этому массиву?
ArrayList «не может быть разрешен» при попытке доступа к ArrayList в методе, Java
Ответ Spring boot rest дает 1 результат на OneToMany, когда в базе данных есть несколько объектов
Регулярное выражение в Java для «больше» или «меньше» без использования скобок «<|>»
Как функция toArray() гарантирует, что список длинного типа не может быть преобразован в массив целых чисел
Как я могу создать исполняемый файл JAR с помощью Maven + JavaFX
Как извлечь псевдоним из таблицы с помощью регулярного выражения?
Как получить доступ к прослушивателям событий объекта, созданного во время выполнения в Java Swing