Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делегирование 
:(
    Опции темы
FCM
Дата 20.11.2012, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Что понимается под делегированием в С++?
Простая пересылка запроса "исходным" объектом другому объекту с передачей ему указателя this на первый?
При этом контекст первоначального запроса можно передать (если не считать параметры методов) только через состояние исходного объекта? Или возможны какие-либо трюки с лямбдами?
Насколько полноценно можно в С++ смоделировать делегирование в том смысле, в каком оно поддерживается некоторыми языками? 

PM MAIL   Вверх
baldina
Дата 20.11.2012, 09:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(FCM @  20.11.2012,  09:22 Найти цитируемый пост)
Что понимается под делегированием в С++?

в С++ - ничего. в С++ можно реализовать этот шаблон.
Цитата(FCM @  20.11.2012,  09:22 Найти цитируемый пост)
Простая пересылка запроса "исходным" объектом другому объекту с передачей ему указателя this на первый?
При этом контекст первоначального запроса можно передать (если не считать параметры методов) только через состояние исходного объекта?

можно так, можно иначе..
вот это простейшее делегирование:
Код

int add (int x, int y) {
  return sum(x,y);
}

и вот это делегирование
Код

typedef int (*summator_t)(int,int);
summator_t summator;
void set_function (summator_t f) { summator = f; }
int sum (int x, int y) {
  return summator (x,y);
}

вот это тоже делегирование
Код

template <typename T, typename U>
class Container {
  T<U> real_container;
  public:
    void push_back (U u) { real_container.push_back(u); }
};

и вот это делегирование
Код

struct ILogger { virtual void log (std::string&)=0; };
struct FileLogger : public ILogger { void log (std::string&); };
struct RemoteLogger : public ILogger { void log (std::string&); };
struct MyLogger : public ILogger {
  ILogger* l_;
  MyLogger(ILogger* logger) : l_(logger){}
  void log (std::string& s ) { l_->log(s); }
};

Цитата(FCM @  20.11.2012,  09:22 Найти цитируемый пост)
Насколько полноценно можно в С++ смоделировать делегирование в том смысле, в каком оно поддерживается некоторыми языками

думаю полноценно. а какие языки имеются в виду?
PM MAIL   Вверх
FCM
Дата 20.11.2012, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(baldina @  20.11.2012,  09:45 Найти цитируемый пост)
думаю полноценно. а какие языки имеются в виду? 

В книга Коплиена упоминаетcя некий язык  self.

Там же говорится, что делегирование основано на связи метода класса одного объекта и контекста, предоставленного другим объектом. Собственно вопрос и связан с возможностями передачи контекста не через параметры метода.


Это сообщение отредактировал(а) FCM - 20.11.2012, 11:26
PM MAIL   Вверх
baldina
Дата 20.11.2012, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



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

Добавлено через 10 минут и 13 секунд
self - прототипно-ориентированный диалект smalltalk, в этом смысле из распространенных к нему близок видимо javascript.
в c++ совсем иной механизм наследования (да и вообще с++ статически типизирован), но делегирование на основе наследования (я так понял, именно этот аспект упоминался в связи с self) вполне реализуется и в с++. в с++ можно делегировать базовому классу (вобщем-то это распространенная техника в ООП):
Код

struct Base {
  virtual void foo() { cout << "Base::foo()"; };
};

struct Derived : public Base {
  // use Base::foo()
};

int main () {
  Derived d;
  d.foo(); // prints "Base::foo()"
}

ну и передача контекста происходит соответственно
PM MAIL   Вверх
FCM
Дата 21.11.2012, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(baldina @  20.11.2012,  12:01 Найти цитируемый пост)
но делегирование на основе наследования (я так понял, именно этот аспект упоминался в связи с self) вполне реализуется и в с++

Нет, в книге Коплиена термин делегирование обсуждается, в основном,  для классов, имеющих ссылочное поле на другой класс. Т.е. речь идет не о статически устанавливаемых отношениях наследования классов, а о динамически устанавливаемых отношениях на уровне объектов.
Например, в одном классе поле-указатель на другой, и метод первого класса вызывает метод второго передавая ему указатель (this) на объект первого класса. Вот и хотелось понять, такой подход полностью ли эквивалентен делегированию в тех языках, где его поддержка встроена в язык?


PM MAIL   Вверх
baldina
Дата 21.11.2012, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(FCM @  21.11.2012,  08:08 Найти цитируемый пост)
в тех языках, где его поддержка встроена в язык

да нет таких языков, и self таковым не является. есть только принцип (довольно простой), который так или иначе реализуем в конкретном языке.
я ведь показал вам, делегирование функционала в С++ (и в других языках) возможно разными способами.
Цитата

В прототип-ориентированных языках, использующих делегирование, среда исполнения способна выполнять диспетчеризацию вызовов методов (или поиск нужных данных) просто следуя по цепочке делегирующих указателей (от объекта к его прототипу), до совпадения.

в с++ такое "следование цепочкам" может быть реализовано как вручную, так и при помощи механизмов языка - полиморфизма, перегрузки, сопоставления шаблона.

Цитата(FCM @  21.11.2012,  08:08 Найти цитируемый пост)
Например, в одном классе поле-указатель на другой, и метод первого класса вызывает метод второго передавая ему указатель (this) на объект первого класса. Вот и хотелось понять, такой подход полностью ли эквивалентен делегированию в тех языках, где его поддержка встроена в язык?

думаю нет:
Код

Normally an object can understand only messages corresponding to its local slots, but by having one or more slots indicating parent objects, an object can delegate any message it doesn't understand itself to the parent object. Any slot can be made a parent pointer by adding an asterisk as a suffix. In this way Self handles duties that would use inheritance in class-based languages.

т.е. делегирование в Self примерно соответствует автоматическому вызову функций базового класса в c++

впрочем, возможно нет оснований ругать Коплиена за неточности и спекуляции, возможно он просто приводит пример динамически устанавливаемых отношений (в с++ это надо делать вручную). в этом смысле подход эквивалентен.

Это сообщение отредактировал(а) baldina - 21.11.2012, 09:51
PM MAIL   Вверх
baldina
Дата 21.11.2012, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



нашел я нужные цитаты
Цитата

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

Цитата

динамическая имитация наследования на стадии выполнения

теперь понятно.

тогда ответ такой: в с++ можно эмулировать возможности делегирования на 100%, но затраты на такую эмуляцию могут быть от совсем небольших до очень значительных. в последнем случае выгоднее будет иное архитектурное решение. каждый ЯП требует определенной системы взглядов на способы решения задач, которая определяется парадигмами, которые поддерживает язык.

Это сообщение отредактировал(а) baldina - 21.11.2012, 10:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.