Делегирование - это механизм по средствам которого, один объект может вызывать метод другого объекта.
Пример:
class methodName{
public $name;
public function getName($name){
return $this->name;
}
}
class Function{
function printName(!!!!!!!methodName $o!!!!!!!!){
echo $o->getName();
}
}
Как я понимаю, делегирование тут выделено знаками !(восклицания)? Так? Или я ошибся?
Спустя 5 минут, 45 секунд (26.10.2011 - 13:06) Dezigo написал(а):
да.
Вот оно
Вот оно
echo $o->getName();
Спустя 3 минуты, 56 секунд (26.10.2011 - 13:10) m4a1fox написал(а):
Dezigo
Ага! То есть вот это
делегирование.... ясно! То есть присвоение объекту $o метода getName.... взятого из класса methodName..... ясненько.... Тогда как вот называется, вот это не подскажите?
Ага! То есть вот это
echo $o->getName();
делегирование.... ясно! То есть присвоение объекту $o метода getName.... взятого из класса methodName..... ясненько.... Тогда как вот называется, вот это не подскажите?
function printName(methodName $o){
Спустя 8 минут, 53 секунды (26.10.2011 - 13:19) Winston написал(а):
Цитата (m4a1fox @ 26.10.2011 - 13:10) |
Тогда как вот называется, вот это не подскажите? |
Приведение типов, значит, что ты можешь в качестве аргумента передать только объект типа methodName
Спустя 1 минута, 11 секунд (26.10.2011 - 13:20) m4a1fox написал(а):
Winston
Ясно! Спасибо Dezigo, Winston. Помогли разложить по полочкам!
Ясно! Спасибо Dezigo, Winston. Помогли разложить по полочкам!
Спустя 24 минуты, 39 секунд (26.10.2011 - 13:44) Invis1ble написал(а):
Цитата |
Приведение типов, значит, что ты можешь в качестве аргумента передать только объект типа methodName |
разве об этом не говорится в книге до рассмотрения делегирования?
Спустя 1 минута, 53 секунды (26.10.2011 - 13:46) Winston написал(а):
Цитата (Invis1ble @ 26.10.2011 - 13:44) |
разве об этом не говорится в книге до рассмотрения делегирования? |
В книге об этом говорится намного раньше чем тема делегирование
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 9 минут, 48 секунд (26.10.2011 - 13:56) Invis1ble написал(а):
Это был намек ТС
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
Спустя 47 секунд (26.10.2011 - 13:57) caballero написал(а):
Цитата |
То есть присвоение объекту $o метода getName.... взятого из класса methodName. |
Нету там никакого присвоения метода и быть не может. Тем более $o как раз и есть экземпляр класса MethodName
Цитата |
разве об этом не говорится в книге до рассмотрения делегирования? |
это просто синтаксис PHP делегирование тут ни при чем
Спустя 2 минуты, 7 секунд (26.10.2011 - 13:59) Invis1ble написал(а):
ясен пень, что не причем. Это вообще основы, которые должны изучаться еще до ООП собственно.
Спустя 7 минут, 35 секунд (26.10.2011 - 14:07) m4a1fox написал(а):
Ясно что основы! Еще раз! Я просто уточнил, что бы до конца понять момент!
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 2 минуты, 5 секунд (26.10.2011 - 14:09) m4a1fox написал(а):
caballero
Цитата |
Тем более $o как раз и есть экземпляр класса MethodName |
А не уточнение ли это?
Спустя 3 минуты, 38 секунд (26.10.2011 - 14:12) Winston написал(а):
Цитата (m4a1fox @ 26.10.2011 - 14:09) |
А не уточнение ли это? |
Точно !
(methodName $o) и есть уточнение типа, так чего спрашивал если знал ?
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Я написал
Цитата (Winston @ 26.10.2011 - 13:19) |
Приведение типов |
т.к. не мог вспомнить это слово "уточнение"
![rolleyes.gif](http://phpforum.ru/html/emoticons/rolleyes.gif)
Спустя 2 минуты, 50 секунд (26.10.2011 - 14:15) m4a1fox написал(а):
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Цитата |
В php5 появилась новая возможность - уточнение типов данных класса. Что бы добавить уточнение типа к аргументу метода, просто поместите перед ним имя класса! |
Спустя 8 часов, 26 минут, 39 секунд (26.10.2011 - 22:42) Greg1978 написал(а):
Формально да, делегирование это вызов интерфейса у другого объекта, фактически слово "делегирование" выходит из объектно-ориентированного проектирования , а не программирования (то есть на уровне абстракции а не реализации). Что это значит вообще по русски
- "передача управления какими то действиями и алгоритмами другому объекту" и не важно каким способом это будет реализовано, почему его ещё называют "чёрным ящиком" (эта тема про наследования через реализацию в объектах не очень хорошо муссировалась здесь
)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 2 часа, 4 минуты, 49 секунд (27.10.2011 - 00:47) bodja написал(а):
m4a1fox
Если это пример Мэтта Зандстра ,то он не самый понятный ,да и еще с ошибкой в коде.
Лень мне конечно все это было писать,но думаю прийдется,а то еще занесет не в ту сторону при изучении ООП.
Здесь ниже таже суть примера ,ну и со сравнением с наследованием.
Теперь ,что мы имеем ?
Мы имеем classB которому доступны свойства и методы classA ,способом "делегирования"
и мы имеем classC которому доступны свойства и методы classA ,способом класического наследования.
В чем собственно разница ,ведь код выполнения один и тот же?
А разница в результате :)
Если это пример Мэтта Зандстра ,то он не самый понятный ,да и еще с ошибкой в коде.
Лень мне конечно все это было писать,но думаю прийдется,а то еще занесет не в ту сторону при изучении ООП.
Здесь ниже таже суть примера ,ну и со сравнением с наследованием.
<?php
class classA {
private $msg="Прювет!!!";
public $cnt=0;
public function metodA(){
$this->cnt++;
return $this->msg;
}
}
class classB {
private $obj;
function __construct($arg) {
$this->obj=$arg;
}
public function metodB() {
echo $this->obj->metodA();
}
}
class classC extends classA {
public function metodC() {
echo 'test';
}
}
$obj1=new classA();
$obj2=new classB($obj1);
$obj3=new classC();
echo $obj2->metodB();
echo $obj1->cnt;
echo $obj3->cnt;
?>
Теперь ,что мы имеем ?
Мы имеем classB которому доступны свойства и методы classA ,способом "делегирования"
и мы имеем classC которому доступны свойства и методы classA ,способом класического наследования.
В чем собственно разница ,ведь код выполнения один и тот же?
А разница в результате :)
Цитата |
Прювет!!! 1 0 |
Я не даром добавил вот эту строчку
Цитата |
$this->cnt++; |
что бы вы поняли чем это может пахнуть,а пахнет я думаю вы уже догадались какой код :)
Тоесть вот это "делегирование" из той же оперы,что и использование глобальных переменных в функциях,но только на уровне ООП. :)
Тоесть работая с уже созданным обьектом ,а не создавая новый экземпляр класса,вы рискуете нежелательной модификацией свойства этого обьекта,с вытекающими последствиями.
Спустя 1 день, 11 часов, 26 минут, 19 секунд (28.10.2011 - 12:13) m4a1fox написал(а):
bodja
Вроде понял... все равно они так похожи.... еще бы знать для каких реальных целей это необходимо.... было бы здорово!
Вроде понял... все равно они так похожи.... еще бы знать для каких реальных целей это необходимо.... было бы здорово!
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 2 часа, 29 минут, 14 секунд (28.10.2011 - 14:42) caballero написал(а):
Цитата |
Вроде понял... все равно они так похожи.... еще бы знать для каких реальных целей это необходимо.... было бы здорово! |
В большинстве случаев для различеых callback функций
Например для обработчиков событий - клас выполняет какуюто бизнес логику потом проверяет - если у него присвоен делегат - дергает его (возможно с параметрами)
когда ты присваиваешь тэгу onclick яваскрипт функцию обрабочик - это и есть пример делегата
Спустя 11 минут, 39 секунд (28.10.2011 - 14:54) m4a1fox написал(а):
caballero
Цитата |
когда ты присваиваешь тэгу onclick яваскрипт функцию обрабочик - это и есть пример делегата |
О! Отличное сравнение... теперь понятнее....
Спустя 19 минут, 16 секунд (28.10.2011 - 15:13) caballero написал(а):
Цитата |
Отличное сравнение... теперь понятнее |
А то!
Мэтт Зандстра тебе понятных примеров не приведет - не царское дело (точнее не та распальцовка).
Спустя 10 минут, 55 секунд (28.10.2011 - 15:24) bodja написал(а):
Цитата |
еще бы знать для каких реальных целей это необходимо.... |
Ну разница в чем,
при делегировании вы работаете с уже созданным обьектом,
при наследовании вы создаете копию classA и присоединяете что у вас уже есть ,то есть classС.
Тоесть ,что получается ,при наследовании вы можете выполнять код classA,но при этом вы не рискуете изменить свойства другого обьекта.
А при делегировании,вам прийдется контролировать этот вопрос,что бы случайно не вызвать
нежелательное изменение свойства другого обьекта.
А в сложном коде,этот вопрос достаточно актуальный.
Это все касаемо многократного использования одинакового кода.
Если же нужно получить просто свойство чужого обьекта,достаточно просто сделать снаружи этих обьектов вот так.
$obj1->pro=$obj2->pro;
Спустя 2 минуты, 29 секунд (28.10.2011 - 15:26) Winston написал(а):
caballero
Можешь сказать какие книги по ООП на твой взгляд лучшие ?
Можешь сказать какие книги по ООП на твой взгляд лучшие ?
Спустя 3 минуты, 5 секунд (28.10.2011 - 15:30) caballero написал(а):
Цитата |
при делегировании вы работаете с уже созданным обьектом |
Делегирование как таковое вообще не связано с наследованием
в большинстве случаев делегаты либо просто ссылки на функцию в нетипизированных языках либо соответствующим образом объявленные типы в типизированных
Спустя 9 минут, 12 секунд (28.10.2011 - 15:39) caballero написал(а):
Цитата |
Можешь сказать какие книги по ООП на твой взгляд лучшие ? |
Не могу - я изучал ООП когда не было никакого PHP и интернета. А была одна на всех книжка Страуструпа по С++ в читалке заводской библиотеки..
Что сейчас читать фиг его знает. Новичкам бы советова книгу Котерова. Естиственно при внимательном изучении подряд по всему языку.
Лично мое мнение - нет смысла изучать ООП (как и паттерны) как некую отдельную дисциплину . Как результат мы видим вопросы - человек даже не понимает где клас где объект. Потому что голая теория вне контекста бесполезна.
Я кстати изучал не ООП как таковое а C++. Остальное приложилось в процесссе изучения и написания программ.
Глупо звучит когда новичок тут пишет - я вот ООП выучил - где бы мнее его применить. А на фига ты учишь то что не знаешь где применять. С таким же успехом мог выучить как коровам в колхозе хвосты крутить.
Если есть задача где нужно ООП то просто бери и решай ее изучая по дороге методы решения синтаксические конструкции и прочее.
Спустя 4 минуты, 52 секунды (28.10.2011 - 15:44) bodja написал(а):
Да,делегирование не связано с наследованием,это два разных подхода.
я выше приводил код и показывал разницу делегирования и наследования.
А в целом я не сторонник ни того не другого.
я выше приводил код и показывал разницу делегирования и наследования.
А в целом я не сторонник ни того не другого.
Спустя 42 секунды (28.10.2011 - 15:44) Winston написал(а):
Спасибо за ответ
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
Цитата (caballero @ 28.10.2011 - 15:39) |
я изучал ООП когда не было никакого PHP и интернета |
Фигасе, как давно
![blink.gif](http://phpforum.ru/html/emoticons/blink.gif)
Спустя 6 минут, 7 секунд (28.10.2011 - 15:50) caballero написал(а):
Цитата |
Да,делегирование не связано с наследованием,это два разных подхода. я выше приводил код и показывал разницу делегирования и наследования. А в целом я не сторонник ни того не другого |
Эти вещи вообще никак не связаны, они решают разные непересекающиеся задачи. В конечном итоге делегирование это обычные callback функции - тут даже ООП как таковое не нужно.
Просто изобразили идею в виде паттерна, а какой же паттерн без ООП - несолидно типа.
Спустя 28 минут, 15 секунд (28.10.2011 - 16:19) bodja написал(а):
Цитата |
Эти вещи вообще никак не связаны, они решают разные непересекающиеся задачи |
Ну знаю я,ну нет у ПХП ни событий ни многопоточности ни прерываний ни dll со своими потоками,калбекам неоткуда взятся,что поделаеш ?
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Но нужно же куда нибудь впихнуть такую фичу,правда?
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Ну нашли ООП ,тоже хорошо,дружно говорим респект Мэтту Зандстре
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Спустя 3 минуты, 19 секунд (28.10.2011 - 16:22) caballero написал(а):
Цитата |
Ну знаю я,ну нет у ПХП ни событий ни многопоточности ни прерываний ни dll со своими потоками,калбекам неоткуда взятся,что поделаеш |
этого обычно нет в большинстве языков
это создается когда пишуться библиотеки фреймворки и все такое
например есть кнопка у нее событие
но кнопка - это не конструкция языка программирования.
Спустя 31 минута, 45 секунд (28.10.2011 - 16:54) bodja написал(а):
Ну незнаю,я создавал напрмер поток на С++ когда собирал DLL для работы с DirectX и GSM кодеком.
Кодек выдрал из UNIX исходников гдето в инете ,ну а DirectX понятно в MSDN.
А калбек передавал этой ДЛЛке из проги на VB6
Это касаемо для компа.
Если говорить про микроконтроллеры,то там вообще все без тормозов,как на Си ,так и на других языках.Что хочеш и как хочеш,лиш бы архитектура ядра это позволяла.
Калбеки- вещь специфичная ,и ними нужно быть очень акуратным,и в языках они применяются,правда очень редко.
Кодек выдрал из UNIX исходников гдето в инете ,ну а DirectX понятно в MSDN.
А калбек передавал этой ДЛЛке из проги на VB6
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Это касаемо для компа.
Если говорить про микроконтроллеры,то там вообще все без тормозов,как на Си ,так и на других языках.Что хочеш и как хочеш,лиш бы архитектура ядра это позволяла.
Калбеки- вещь специфичная ,и ними нужно быть очень акуратным,и в языках они применяются,правда очень редко.
Спустя 4 минуты, 50 секунд (28.10.2011 - 16:59) caballero написал(а):
Цитата |
Ну незнаю,я создавал напрмер поток на С++ когда собирал DLL для работы с DirectX и GSM кодеком. |
в C++ никаких потоков нет - это либо API либо классы с той или иной библиотеки.
Цитата |
Если говорить про микроконтроллеры,то там вообще все без тормозов,как на Си ,так и на других языках.Что хочеш и как хочеш,лиш бы архитектура ядра это позволяла. |
Там ты пишешь код прямо на железо и никакой Билл Гейтс со своим виндовым API на дороге не стоит
Впрочем С для микроконтролеров как правило обрезанный и как правиило не C++ - это слишком громоздко для ограниченного объема памяти..
Спустя 4 часа, 24 минуты, 4 секунды (28.10.2011 - 21:23) bodja написал(а):
Цитата |
в C++ никаких потоков нет - это либо API либо классы с той или иной библиотеки. |
Ну действительно
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
а API или библиотеки на каком языке написаны?
На инопланетном ?
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Вам просто не приходилось их готовить.C++ - Потоки в Win32
Цитата |
С для микроконтролеров как правило обрезанный |
Ну что есть ,то есть
![rolleyes.gif](http://phpforum.ru/html/emoticons/rolleyes.gif)
урезано там,урезано на ПХП - вот так и живем с обрезаниями.
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Спустя 3 дня, 11 часов, 44 минуты, 42 секунды (1.11.2011 - 09:07) linker написал(а):
function printName(methodName $o){назыается Type Hinting
Спустя 2 минуты, 12 секунд (1.11.2011 - 09:10) linker написал(а):
caballero
Потоки есть везде где есть банальный I/O. Файл - это тоже поток. Работа с сокетами - это тоже работа с потоками. В Сях основная либа iostream.
Потоки есть везде где есть банальный I/O. Файл - это тоже поток. Работа с сокетами - это тоже работа с потоками. В Сях основная либа iostream.
Спустя 1 час, 43 минуты, 16 секунд (1.11.2011 - 10:53) caballero написал(а):
Цитата |
Потоки есть везде где есть банальный I/O. Файл - это тоже поток. Работа с сокетами - это тоже работа с потоками. В Сях основная либа iostream. |
Потоки есть в операционной системе (это объект ядра), а не в С или каком либо еще языке програмирования.
И кстати речь шла не о потоках stream а о потоках thread