Подтвердить что ты не робот

Когда использовать делегирование вместо наследования?

Может кто-нибудь объяснить, когда я хочу использовать делегирование вместо наследования?

4b9b3361

Ответ 1

Если вы хотите "скопировать" /выдать API базового класса, вы используете наследование. Когда вы хотите только "скопировать" функциональность, используйте делегирование.

Один из примеров: Вы хотите создать Stack из списка. Стек имеет только pop, push и peek. Вы не должны использовать наследование, учитывая, что вам не нужны функции push_back, push_front, removeAt и др. В стеке.

Ответ 2

Они не имеют никакого отношения друг к другу. Делегирование - это поведение. Наследование - это модельный метод.

Наследование предназначено для моделирования "is-a". ЭБУ системы "есть-a".

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

Ответ 3

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

Ответ 4

Предположим, что ваш класс называется B, а производный/делегированный класс называется A, тогда

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

  • вы хотите выразить отношения (is-a), то вы хотите использовать наследование.
  • вы хотите передать свой класс существующим API, ожидающим A, тогда вам нужно использовать наследование.
  • вы хотите улучшить A, но A является окончательным и больше не может быть подклассом, тогда вам нужно использовать состав и делегирование.

Ответ 5

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

Возьмите камень in_threads, он использует делегирование InThreads для реализации потоков для любого Ruby Enumerable модуля. При этом, только вызовы in_threads методы в массиве, он будет работать в потоках.