Может кто-нибудь объяснить, когда я хочу использовать делегирование вместо наследования?
Когда использовать делегирование вместо наследования?
Ответ 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 методы в массиве, он будет работать в потоках.