Почему композиция лучше наследования

Обновлено: 30.06.2024

Основное отличие между ними состоит в том, что композиция позволяет переиспользовать код без его расширения. Наследование при этом требует расширения существующего класса. Другое важное отличие: при композиции мы можем повторно использовать код даже из final-класса, тогда как унаследоваться от него невозможно.

В чем разница между агрегацией и композицией?

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

В чем разница между композицией и наследованием JS?

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

Наследование (inheritance) является одним из ключевых моментов ООП. Благодаря наследованию один класс может унаследовать функциональность другого класса. Для класса Employee базовым является Person, и поэтому класс Employee наследует все те же свойства, методы, поля, которые есть в классе Person. .

Что такое композиция классов?

Что такое композиция? Композиция — это концепция, которая моделирует отношения. Она позволяет создавать сложные типы, комбинируя объекты других типов. Это означает, что класс Composite может содержать объект другого класса Component.

Почему композиция лучше чем наследование?

Основное отличие между ними состоит в том, что композиция позволяет переиспользовать код без его расширения. Наследование при этом требует расширения существующего класса. Другое важное отличие: при композиции мы можем повторно использовать код даже из final-класса, тогда как унаследоваться от него невозможно.

Когда лучше использовать наследование а не агрегацию?

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

В чем смысл парадигмы полиморфизма?

Полиморфизм — одна из трех основных парадигм ООП. Если говорить кратко, полиморфизм — это способность обьекта использовать методы производного класса, который не существует на момент создания базового. Для тех, кто не особо сведущ в ООП, это, наверно, звучит сложно.

Какие бывают композиции произведения?

  • Линейная. События идут один за другим в хронологической последовательности. .
  • Обратная или инверсионная. Сначала описываются финальные сцены сюжета. .
  • Параллельная. В произведении есть несколько главных героев. .
  • Полифоническая. .
  • Кольцевая композиция.

Можно ли наследоваться от нескольких классов?

single inheritance), при котором класс может наследоваться только от одного суперкласса. . В список языков, поддерживающих множественное наследование, входят: Io, Eiffel, C++, Dylan, Python, некоторые реализации классов JavaScript (например, dojo.

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

Как работает наследование в JavaScript?

В плане наследования JavaScript работает лишь с одной сущностью: объектами. Каждый объект имеет внутреннюю ссылку на другой объект, называемый его прототипом. У объекта-прототипа также есть свой собственный прототип и так далее до тех пор, пока цепочка не завершится объектом, у которого свойство prototype равно null .

Каким способом в С ++ реализуется композиция классов?

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

Что характерно для композиции Ооп?

Еще одной особенностью объектно-ориентированного программирования является возможность реализовывать так называемый композиционный подход. Композицию обычно не выделят как основное свойство ООП наряду с наследованием, инкапсуляцией и полиморфизмом, так как она используется сравнительно реже. .

Что такое ассоциация агрегация и композиция?

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

Являются ли композиция и наследование одинаковыми? Если я хочу реализовать шаблон композиции, как я могу это сделать на Java?

ОТВЕТЫ

Ответ 1

Они абсолютно разные. Наследование - это отношение "is-a". Композиция - это "has-a".

Вы делаете композицию, имея экземпляр другого класса C как поле своего класса, вместо расширения C . Хорошим примером того, что композиция была бы намного лучше, чем наследование, является java.util.Stack , который в настоящее время расширяет java.util.Vector . Это сейчас считается ошибкой. Вектор "-НЕ-a" стека; вам не разрешается вставлять и удалять элементы произвольно. Это должно было быть композиция.

Я очень рекомендую книгу Джоша Блоха Эффективное Java 2nd Edition

  • Пункт 16: Офорт композиции над наследованием
  • Пункт 17: Дизайн и документ для наследования или запрет на него

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

Ответ 2

Состав означает HAS A
Наследование означает IS A

Example : Автомобиль имеет Двигатель и автомобиль - это Автомобиль

В программировании это представляется как:

Ответ 3

Насколько наследование может быть опасным?

Давайте возьмем пример

1) Как ясно из приведенного выше кода, класс Y имеет очень сильную связь с классом X. Если что-то изменится в суперклассе X, Y может резко сломаться. Предположим, что в будущем класс X реализует метод работы с подписью ниже

Изменение сделано в классе X, но это сделает класс Y некомпилируемым. Так что такая зависимость может подняться на любой уровень, и это может быть очень опасно. Каждый раз, когда суперкласс может не иметь полной видимости кода внутри всех его подклассов, и подкласс может постоянно замечать, что происходит в суперклассе все время. Поэтому нам нужно избегать этой сильной и ненужной связи.

Как композиция решает эту проблему?

Давайте посмотрим, пересмотрев тот же пример

Здесь мы создаем ссылку на класс X в классе Y и вызываем метод класса X, создавая экземпляр класса X. Теперь все, что сильная связь исчезла. Суперкласс и подкласс теперь очень независимы друг от друга. Классы могут свободно вносить изменения, которые были опасны в ситуации наследования.

2) Второе очень хорошее преимущество композиции в том, что оно обеспечивает гибкость вызова метода, например:

В тестовом классе, используя ссылку r, я могу вызывать методы класса X, а также класса Y. Эта гибкость никогда не была в наследстве

3) Еще одно большое преимущество: модульное тестирование

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

4) Еще одна веская причина, по которой мы должны избегать наследования, заключается в том, что Java не поддерживает множественное наследование.

Давайте рассмотрим пример, чтобы понять это:

состав легко достигается во время выполнения, в то время как наследование обеспечивает его особенности во время компиляции

состав также известен как отношение HAS-A, а наследование также известно как отношение IS-A

Так что возьмите в привычку всегда предпочитать композицию наследованию по разным причинам.

Ответ 4

Ответ, заданный @Michael Rodrigues, неверен (я извиняюсь, я не могу комментировать напрямую) и может привести к некоторой путанице.

Интерфейсная реализация является формой наследования. при реализации интерфейса вы не только наследуете все константы, что ваш объект будет иметь тип, указанный интерфейсом; он по-прежнему является " is-a" . Если автомобиль реализует Fillable, автомобиль " is-a" Fillable и может использоваться в вашем коде везде, где вы бы использовали Fillable.

Состав принципиально отличается от наследования. Когда вы используете композицию, вы (как и другие ответы) отмечаете связь " has-a" между двумя объектами, в отличие от отношения " is-a" которые вы делаете, когда используете наследование.

Итак, из примеров автомобилей в других вопросах, если бы я хотел сказать, что бензобак " имеет-", я бы использовал композицию следующим образом:

Надеюсь, это устранит любые недоразумения.

Ответ 5

Наследование выявляет отношения IS-A. Композиция выявляет отношения HAS-A. Шаблон стратегии объясняет, что Composition следует использовать в тех случаях, когда существуют семейства алгоритмов, определяющих конкретное поведение.
Классическим примером является класс утки, который реализует летное поведение.

Таким образом, мы можем иметь несколько классов, которые реализуют полет, например:

Если бы это было по наследству, у нас было бы два разных класса птиц, которые снова и снова выполняют функцию мухи. Так что наследование и состав совершенно разные.

Ответ 6

Композиция так же звучит - вы создаете объект, вставляя части.

ИЗМЕНИТЬ, остальная часть этого ответа ошибочно основана на следующей предпосылке.
Это достигается с помощью интерфейсов.
Например, используя пример Car выше,

Итак, с помощью нескольких стандартных теоретических компонентов вы можете создать свой объект. Затем выполните свою работу, чтобы заполнить, как House защищает своих обитателей и как Car защищает своих обитателей.

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

Например, MotorVehicle может иметь метод Fuelable и Drive . Вы можете оставить метод Fuel так, как он есть, потому что он заполняет мотоцикл и автомобиль, но вы можете переопределить метод Drive , потому что Motorbike очень сильно отличается от Car .

С наследованием некоторые классы уже полностью реализованы, а в других - методы, которые вы вынуждены переопределять. С композицией ничего не дано вам. (но вы можете реализовать интерфейсы, вызывая методы в других классах, если у вас что-то лежит).

Композиция считается более гибкой, потому что, если у вас есть такой метод, как iUsesFuel, вы можете иметь метод где-то еще (другой класс, другой проект), который просто беспокоится о работе с объектами, которые могут питаться, независимо от того, автомобиль, катер, плита, барбекю и т.д. Интерфейсы гарантируют, что классы, которые говорят, что они реализуют этот интерфейс, действительно имеют методы, которыми обладает этот интерфейс. Например,

тогда у вас может быть метод где-то еще

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

Если вы использовали Наследование, вам понадобятся разные методы FillHerUp для работы с MotorVehicles и Barbecues , если у вас не есть какой-то довольно странный базовый объект ObjectThatUsesFuel, из которого можно наследовать.

Ответ 7

Являются ли композиция и наследование одинаковыми?

Они не одинаковы.

Состав: он позволяет обрабатывать группу объектов так же, как один экземпляр объекта. Цель композита состоит в том, чтобы "компонировать" объекты в древовидных структурах с представлять иерархии целого целого.

Наследование: класс наследует поля и методы из всех своих суперклассов, будь то прямые или косвенные. Подкласс может переопределять методы, которые он наследует, или может скрывать поля или методы, которые он наследует.

Если я хочу реализовать шаблон композиции, как я могу это сделать на Java?

Wikipedia статья достаточно хороша, чтобы реализовать составной шаблон в java.

введите описание изображения здесь

Ключевые участники:

Компонент:

  • Является абстракцией для всех компонентов, включая составные.
  • Объявляет интерфейс для объектов в композиции

лист

  • Представляет листовые объекты в композиции
  • Реализует все методы компонентов

Composite

  • Представляет составной компонент (компонент, имеющий дочерние элементы)
  • Реализует методы управления детьми
  • Реализует все методы Component, обычно путем делегирования их дочерним элементам

Пример кода для понимания шаблона Композитный:

  • Часть - это лист
  • Автомобиль содержит много частей
  • В автомобиль добавлены различные запчасти автомобиля
  • Цена Автомобиль= сумма (Цена каждой Части)

См. ниже вопрос о преимуществах и недостатках композиции и наследования.

Ответ 8

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

Ответ 9

В простой агрегации слов означает "Отношения".

Состав - это особый случай агрегации. Более конкретно, ограниченная агрегация называется композицией. Когда объект содержит другой объект, если содержащийся объект не может существовать без существования контейнерного объекта, тогда он называется композицией. Пример: класс содержит учащихся. Студент не может существовать без класса. Существует композиция между классом и учениками.

Зачем использовать агрегацию

Повторное использование кода

При использовании агрегации

Повторное использование кода также наилучшим образом достигается путем агрегирования, когда нет отношения к кораблю

Наследование

Наследование является родительским отношением к наследству от детей. Это отношение

Наследование в java - это механизм, в котором один объект приобретает все свойства и поведение родительского объекта.

Использование наследования в Java 1 Повторное использование кода. 2 Добавить дополнительную функцию в дочернем классе, а также переопределить метод (так что полиморфизм времени выполнения может быть достигнут).

Ответ 10

Наследование между двумя классами, где один класс расширяет другой класс, устанавливает связь " IS A".

Состав на другом конце содержит экземпляр другого класса в вашем классе, который устанавливает связь " имеет A". Состав в java полезен, поскольку он технически облегчает множественное наследование.

Ответ 11

Состав состоит из того, что что-то состоит из отдельных частей и имеет прочные отношения с этими частями. Если основная часть умирает, так и другие, у них не может быть собственной жизни. Грубым примером является человеческое тело. Выньте сердце, и все остальные части отмирают.

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

Я не знаю Java, поэтому не могу привести пример, но я могу дать объяснение понятий.

Ответ 12

Несмотря на то, что оба наследования и композиции обеспечивают повторное использование кода, основное различие между композицией и наследованием в Java заключается в том, что Composition позволяет повторно использовать код без его расширения, но для Inheritance вы должны расширить класс для повторного использования кода или функциональности. Другое отличие от этого факта заключается в том, что с помощью композиции вы можете повторно использовать код для даже окончательного класса, который не является расширяемым, но Inheritance не может повторно использовать код в таких случаях. Кроме того, используя Composition, вы можете повторно использовать код из многих классов, поскольку они объявлены как только переменная-член, но с Inheritance вы можете повторно использовать форму кода только одного класса, потому что в Java вы можете расширять только один класс, поскольку множественное Наследование не поддерживается в Java, Вы можете сделать это на С++, хотя из-за того, что один класс может расширять несколько классов. BTW, вы всегда должны предпочитать композицию над наследованием в Java, ее не только я, но даже Джошуа Блох предложил в своей книге

Ответ 13

Я думаю, что этот пример ясно объясняет различия между наследованием и композицией.

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

Там вы также можете увидеть разницу в представлении, когда используете UML для наследования или композиции.

Ответ 14

Наследование с композицией.

Наследования и состав используются для повторного использования и расширения поведения класса.

Наследование в основном используется в модели программирования алгоритмов семейства, такой как тип отношения IS-A, означает аналогичный вид объекта. Пример.

  • Duster - автомобиль
  • Сафари - автомобиль

Они относятся к семейству Car.

Композиция представляет собой отношение HAS-A Type.It показывает способность объекта, такого как Duster, имеет Five Gears, Safari имеет четыре Gears и т.д. Всякий раз, когда нам нужно расширить способность существующего класса, используйте композицию. Пример нам нужно добавить еще одну передачу в объект Duster, тогда мы должны создать еще один объект передачи и скомпоновать его объекту duster.

Мы не должны вносить изменения в базовый класс до тех пор, пока все производные классы не будут нуждаться в этих функциях. Для этого сценария мы должны использовать композицию. Так как

класс A Производится классом B

Класс A, полученный классом C

Класс A, полученный классом D.

Когда мы добавляем какие-либо функциональные возможности в класс А, тогда он доступен для всех подклассов, даже если классам C и D не требуются эти функции. Для этого сценария нам необходимо создать отдельный класс для этих функций и составить его для требуемый класс (вот класс B).

Ниже приведен пример:

Ответ 15

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

Наследование - это предыдущий класс с расширенной функцией. Это означает, что этот новый класс - это класс Old с некоторой расширенной функцией. Предположим, что студент - студент, но все ученики - это люди. Так что есть отношения со студентами и людьми. Это Наследование.

Ответ 16

Нет, оба разные. Композиция соответствует отношениям "HAS-A" и наследованию следуют отношения "IS-A". Лучшим примером для композиции был стратегический паттерн.

Ответ 17

Наследование означает повторное использование всей функциональности класса. Здесь мой класс должен использовать все методы суперкласса, и мой класс будет аккуратно связан с суперклассом, и код будет продублирован в обоих классах в случае наследования.

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

Эта диаграмма показывает, как можно гибко спроектировать поведение мухи и звука животного, используя принцип построения композиции по наследованию. [1]

Композиция над наследованием (или же композитный принцип повторного использования) в объектно-ориентированного программирования (ООП) - это принцип, которым должны соответствовать классы. полиморфный поведение и повторное использование кода по их сочинение (путем содержания экземпляров других классов, реализующих желаемую функциональность), а не наследование из базового или родительского класса. [2] Это часто упоминаемый принцип ООП, например, во влиятельной книге Шаблоны проектирования (1994). [3]

Содержание

Основы

Реализация композиции вместо наследования обычно начинается с создания различных интерфейсы представление поведения, которое должна демонстрировать система. Интерфейсы позволяют полиморфный поведение. Классы, реализующие идентифицированные интерфейсы, создаются и добавляются в бизнес-домен классы по мере необходимости. Таким образом, поведение системы реализуется без наследования.

Фактически, все классы бизнес-домена могут быть базовыми классами без какого-либо наследования. Альтернативная реализация поведения системы достигается путем предоставления другого класса, реализующего интерфейс желаемого поведения. Класс, содержащий ссылку на интерфейс, может поддерживать реализации интерфейса - выбор, который может быть отложен до времени выполнения.

Пример

Наследование

Пример в C ++ следует:

Затем предположим, что у нас также есть эти конкретные классы:

  • учебный класс Игрок - который Твердый , Подвижный и Видимый
  • учебный класс Облако - который Подвижный и Видимый , но нет Твердый
  • учебный класс Строительство - который Твердый и Видимый , но нет Подвижный
  • учебный класс Ловушка - который Твердый , но ни Видимый ни Подвижный

Обратите внимание, что множественное наследование опасно, если не реализовано осторожно, так как оно может привести к проблема с алмазом. Одно из решений избежать этого - создать такие классы, как VisibleAndSolid , VisibleAndMovable , VisibleAndSolidAndMovable и т. д. для каждой необходимой комбинации, хотя это приводит к большому количеству повторяющегося кода. Помните, что C ++ решает алмазную проблему множественного наследования, разрешая виртуальное наследование.

Состав и интерфейсы

Представьте абстрактный класс с именем ВидимостьДелегат , с подклассами Невидимый и Видимый , который предоставляет средства рисования объекта:

Представьте абстрактный класс с именем UpdateDelegate , с подклассами NotMovable и Подвижный , который позволяет перемещать объект:

Представьте абстрактный класс с именем СтолкновениеДелегат , с подклассами NotSolid и Твердый , который обеспечивает средство столкновения с объектом:

Наконец, представьте класс с именем Объект с членами для управления его видимостью (используя ВидимостьДелегат ), подвижность (с использованием UpdateDelegate ) и твердость (используя СтолкновениеДелегат ). У этого класса есть методы, которые делегируют его членам, например Обновить() просто вызывает метод на UpdateDelegate :

Тогда конкретные классы будут выглядеть так:

Преимущества

Преимущество композиции перед наследованием - это принцип дизайна, который придает дизайну большую гибкость. Более естественно строить классы бизнес-домена из различных компонентов, чем пытаться найти между ними общие черты и создавать генеалогическое древо. Например, педаль акселератора и рулевое колесо имеют очень мало общих черт, но оба являются жизненно важными компонентами в автомобиле. Легко определить, что они могут делать и как их можно использовать в интересах автомобиля. Композиция также обеспечивает более стабильную сферу бизнеса в долгосрочной перспективе, поскольку она менее подвержена причудам членов семьи. Другими словами, лучше составить то, что может делать объект (ИМЕЕТ) чем расширить то, что это есть (ЭТО). [1]

Первоначальный дизайн упрощается за счет определения поведения системных объектов в отдельных интерфейсах вместо создания иерархических отношений для распределения поведения между классами бизнес-домена посредством наследования. Такой подход легче адаптируется к будущим изменениям требований, которые в противном случае потребовали бы полной реструктуризации классов бизнес-домена в модели наследования. Кроме того, он позволяет избежать проблем, часто связанных с относительно небольшими изменениями в модели на основе наследования, которая включает несколько поколений классов.

Некоторые языки, особенно Идтииспользуйте исключительно шрифтовую композицию. [4]

Недостатки

Одним из распространенных недостатков использования композиции вместо наследования является то, что методы, предоставляемые отдельными компонентами, могут быть реализованы в производном типе, даже если они только методы пересылки (это верно для большинства языков программирования, но не для всех; см. Избегаем недостатков.) Напротив, наследование не требует повторной реализации всех методов базового класса в производном классе. Скорее, производный класс должен только реализовать (переопределить) методы, поведение которых отличается от поведения методов базового класса. Это может потребовать значительно меньших усилий по программированию, если базовый класс содержит много методов, обеспечивающих поведение по умолчанию, и только некоторые из них нужно переопределить в производном классе.

Избегаем недостатков

Этого недостатка можно избежать, используя черты, миксины, (тип) встраивание, или же протокол расширения.

Некоторые языки предоставляют специальные средства для смягчения этого:

Эмпирические исследования

Исследование 93 программ Java с открытым исходным кодом (различного размера) в 2013 году показало, что:

Хотя нет огромной [sic] возможности заменить наследование композицией (. ), возможность значительна (в среднем 2% использований [наследования] являются только внутренним повторным использованием, а еще 22% - только внешними или внутренними Наши результаты показывают, что нет необходимости беспокоиться о злоупотреблении наследованием (по крайней мере, в программном обеспечении Java с открытым исходным кодом), но они подчеркивают вопрос, касающийся использования композиции по сравнению с наследованием. Если есть значительные затраты, связанные с использованием наследования, когда можно использовать композицию, то наши результаты предполагают, что есть некоторая причина для беспокойства.


Загрузите это великолепное Приложение React Native Store Locator шаблон, чтобы создать собственное приложение для поиска магазинов всего за несколько минут. Используя этот полностью закодированный стартовый набор, написанный на React Native, вы экономите недели проектирования и разработки и можете сосредоточиться на других важных усилиях, таких как привлечение клиентов и маркетинг.

Если у вас есть какие-либо знания об объектно-ориентированном программировании, то вы, возможно, слышали эти два слова – наследование и композиция. Наследование и композиция – две важные части объектно-ориентированного программирования, когда речь идет о возможности повторного использования кода. Обе эти концепции также имеют отношение к компонентам React. Следовательно, концепция наследования и композиции очень важна.

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

Да, и наследование, и композиция могут использоваться для повторного использования кода и для улучшения компонентов, но, согласно основной команде React, мы должны предпочесть композицию наследованию.

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

Наследование – это концепция объектно-ориентированного программирования, в которой один класс наследует свойства и методы другого класса. Это полезно для повторного использования кода. Посмотрим, как это реализовано в React.

Выполнение

В основном классе используются три компонента: Автомобиль, Автомобиль и Велосипед. Автомобиль является базовым классом, а классы Car и Bike являются производными от него с помощью ключевого слова extends. Классы Car и bikes наследуют свойства класса Vehicle. Метод рендеринга в классе Vehicle наследуется обоими производными классами. Кроме того, свойство className также наследуется классами Car and Bike.


Добавление еще одного компонента

В этом компоненте мы использовали метод рендеринга. Помните, что этот класс наследует метод рендеринга класса Vehicle. Итак, чтобы добавить дополнительный текст, мы должны использовать супер-метод для вызова метода рендеринга базового класса. Посмотрим на результат.


В классе Truck мы передали тег span с текстом методу рендеринга базового класса, то есть Vehicle.

В классе Vehicle мы использовали аргумент и распечатали его с названием автомобиля. Посмотрим, получим ли мы желаемый результат или нет.


Да, желаемый результат получен. Но так ли это? Нет, это не так. Мы передали аргумент от класса Truck, но как насчет других классов? Мы не должны использовать этот метод, потому что класс Vehicle должен учитывать варианты использования другого класса. Помните, чем больше вариантов использования, тем больше аргументов. Здесь это выглядит хорошо, но когда есть несколько случаев, подобных этому, код станет сложным, и его будет очень трудно поддерживать. Мы используем наследование для повторного использования кода, чтобы код в первую очередь выглядел менее сложным? Не так ли?

Есть лучший способ повторного использования кода и улучшения компонентов. При наследовании используется метод отношения is-a. Производные компоненты должны были наследовать свойства базового компонента, и это было довольно сложно при изменении поведения любого компонента. Композиция нацелена на лучшее. Вместо того, чтобы наследовать свойства других компонентов, почему бы не унаследовать только поведение и не добавить поведение к желаемому компоненту?

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

Выполнение

В приведенном выше коде мы использовали композицию. Обратите внимание: код не наследуется ни от одного другого компонента. Но мы видим, что классы Car и Bike наследуют поведение класса Vehicle. Мы просто использовали компонент Vehicle внутри обоих классов. Посмотрим на результат.


Очевидно, что классы Car и Bike наследуют поведение класса Vehicle. Теперь давайте добавим еще один компонент, который унаследует поведение класса Vehicle, но наряду с существующим поведением мы также добавим новое поведение.

Мы снова добавили компонент Truck, но на этот раз использовали композицию. Мы также добавили к нему новое поведение. Посмотри, как это просто. Нам не нужно ничего делать с классом Vehicle. Таким образом, это не влияет на другие компоненты.


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

Это завершает наше понимание наследования и композиции в React.

Вот почему композиция предпочтительнее наследования. Использовать композицию довольно легко и просто, в то время как наследование значительно усложняется с добавлением большего количества кода. Добавление поведения в композицию настолько простое, что нам просто нужно изменить код только в компоненте. В наследовании есть сложность, связанная с добавлением нового поведения. Добавление большего количества поведения приводит к большему количеству вариантов использования, что, в свою очередь, приводит к большему количеству аргументов. Код становится более сложным и труднодоступным. Следовательно, в React логично предпочесть композицию наследованию. Таким образом, в этой статье распространена концепция наследования и композиции, которая важна для любого программиста.

Читайте также: