Объектно-ориентированное программирование основывается на наследовании как методе обмена кодом между объектами в иерархии родитель-потомок. Строгая древовидная природа иерархии родитель-потомок означает, что нередко можно столкнуться с «алмазной проблемой» .

В этом примере Scanner
и Printer
наследуются от PoweredDevice
. Copier
должен иметь общее поведение Scanner
и Printer
, но в большинстве языков объектно-ориентированного программирования вам не разрешено наследовать от двух родителей.
Другие языки и библиотеки предпочитают метод, называемый состав , как альтернатива наследования. React попадает в эту категорию. Вы можете определить столько вариантов многократного использования, сколько пожелаете, для компонентов более высокого порядка, а затем применить их все к компоненту.
function Copier() {
return (
// ...
)
}
export default withScanner(withPrinter(App)))
Вы по-прежнему создаете иерархию, но динамически создаете их во время выполнения,Нет статического правила, которое говорит, что withPrinter
должен быть потомком withPoweredDevice
- в отличие от традиционного наследования, где вы должны определить иерархию, когда вы создаете класс (до компиляции).
Документы React даже предоставляютдокумент, который рассматривает "состав против наследования" , который является отличным местом для чтения, чтобы понять различия между двумя парадигмами.
В заключение:
- И OOP, и HOC позволяют повторное использование кода
- Класс OOP может расширяться только от одного родителя
- Компоненты React могут быть обернуты любым количеством HOC
- OOP позволяет повторное использование только вместестатические иерархии времени компиляции
- HOCs позволяют повторно использовать динамические иерархии времени выполнения