![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| -=Ustas=- |
|
||||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: нет Всего: 69 |
Мое почтение!
Неоднократно встречал подобные конструкции:
Сам такого не применял, стало интересно, что это и в чем его преимущества перед обычным наследованием. Копал литературу, и пришел к теме делигирования. Т.е., pls, поясните разницу между данными подходами, их преимущества / недостатки, рациональность / нерациональность их использования в каких-нить частных случаях:
Желательно, было бы кульно, если разъяснили бы все на примерах, в каких случаях стоит применять, а в каких нет.... Сеньки заранее! Это сообщение отредактировал(а) -=Ustas=- - 2.6.2006, 23:32 -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
||||
|
|||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 1 Всего: 261 |
Лично я преимуществ не вижу. Это все-таки разгные понятия. Наследование подрозумевает под собой переопределение, как бы абстрактных параметров, а тут - просто замещение, что не есть хорошо. ОДин большой объект с кучей всего. В случае модификаций, придется менять все.
Нет абстракции |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 1 Всего: 64 |
Это не делегирование, а лишь обычная ссылка на экземпляр класса, хранящаяся в переменной-члене класса a.
Делегирование выглядело бы так(PHP5):
Т.е. при создании экземпляра класса b ты внутри инстанцируешь скрытый экземпляр класса a, благодаря чему доступ к его методам скрыт. Так вот для того чтобы получить возможность доступа к этим методам (или к части методов) и используют подход, именуемый делегирование, т.е. это попросту обертка для вызова метода внутреннего объекта. Зачем это нужно? К примеру затем, чтобы: 1) Скрыть какие то методы существующего класса 2) Упростить инструкцию вызова нужного метода (к примеру, не совсем быстро набирать что то вроде $instance->objectA->objectB->objectC->objectD->objectE->someMethod()->helloWorld() 3) Адаптация интерфейсов (можешь посмотреть ООД шаблон, именуемый адаптером - adapter (или оберткой - wrapper)). Т.е. у тебя имеются разнородные интерфейсы, допустим mysql и oracle API и нужно привести их к одному интерфейсу для создания уровня абстракции от СУБД. Для этого пишется нужный набор классов, которые делегируют вызовы этих API в нужном интерфейсе. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: нет Всего: 69 |
Пасибки за пояснительный пример!
-------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
| szz |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1289 Регистрация: 31.5.2005 Где: Moscow, Jerusalem Репутация: 1 Всего: 33 |
Это вроде композицией называется (по крайней мере в С++), впрочем есть и другие названия.
Не согласен. Все зависит от случая - бывает когда композиция необходима (например, если у вас есть класс "точка", а потом вы создаете класс "Треугольник". В треугольнике будут три точки, все логично. И еще много примеров пользы такого подхода) --------------------
|
||||||
|
|||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Extensions | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |