![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Что понимается под делегированием в С++?
Простая пересылка запроса "исходным" объектом другому объекту с передачей ему указателя this на первый? При этом контекст первоначального запроса можно передать (если не считать параметры методов) только через состояние исходного объекта? Или возможны какие-либо трюки с лямбдами? Насколько полноценно можно в С++ смоделировать делегирование в том смысле, в каком оно поддерживается некоторыми языками? |
|||
|
||||
baldina |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в С++ - ничего. в С++ можно реализовать этот шаблон. можно так, можно иначе.. вот это простейшее делегирование:
и вот это делегирование
вот это тоже делегирование
и вот это делегирование
думаю полноценно. а какие языки имеются в виду? |
||||||||||
|
|||||||||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
В книга Коплиена упоминаетcя некий язык self. Там же говорится, что делегирование основано на связи метода класса одного объекта и контекста, предоставленного другим объектом. Собственно вопрос и связан с возможностями передачи контекста не через параметры метода. Это сообщение отредактировал(а) FCM - 20.11.2012, 11:26 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
если класс, который производит реальную работу, может принимать контекст не только через параметры метода (а через конструктор например), то это возможно. способы, доступные делегирующему классу, зависят от возможностей, предоставляемых делегируемым.
Добавлено через 10 минут и 13 секунд self - прототипно-ориентированный диалект smalltalk, в этом смысле из распространенных к нему близок видимо javascript. в c++ совсем иной механизм наследования (да и вообще с++ статически типизирован), но делегирование на основе наследования (я так понял, именно этот аспект упоминался в связи с self) вполне реализуется и в с++. в с++ можно делегировать базовому классу (вобщем-то это распространенная техника в ООП):
ну и передача контекста происходит соответственно |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Нет, в книге Коплиена термин делегирование обсуждается, в основном, для классов, имеющих ссылочное поле на другой класс. Т.е. речь идет не о статически устанавливаемых отношениях наследования классов, а о динамически устанавливаемых отношениях на уровне объектов. Например, в одном классе поле-указатель на другой, и метод первого класса вызывает метод второго передавая ему указатель (this) на объект первого класса. Вот и хотелось понять, такой подход полностью ли эквивалентен делегированию в тех языках, где его поддержка встроена в язык? |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
да нет таких языков, и self таковым не является. есть только принцип (довольно простой), который так или иначе реализуем в конкретном языке. я ведь показал вам, делегирование функционала в С++ (и в других языках) возможно разными способами.
в с++ такое "следование цепочкам" может быть реализовано как вручную, так и при помощи механизмов языка - полиморфизма, перегрузки, сопоставления шаблона. думаю нет:
т.е. делегирование в Self примерно соответствует автоматическому вызову функций базового класса в c++ впрочем, возможно нет оснований ругать Коплиена за неточности и спекуляции, возможно он просто приводит пример динамически устанавливаемых отношений (в с++ это надо делать вручную). в этом смысле подход эквивалентен. Это сообщение отредактировал(а) baldina - 21.11.2012, 09:51 |
||||
|
|||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
нашел я нужные цитаты
теперь понятно. тогда ответ такой: в с++ можно эмулировать возможности делегирования на 100%, но затраты на такую эмуляцию могут быть от совсем небольших до очень значительных. в последнем случае выгоднее будет иное архитектурное решение. каждый ЯП требует определенной системы взглядов на способы решения задач, которая определяется парадигмами, которые поддерживает язык. Это сообщение отредактировал(а) baldina - 21.11.2012, 10:08 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |