Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
rom85ich
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 16
#1

Делегирование - Objective-C

28.02.2015, 13:43. Просмотров 824. Ответов 5
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане. Делегирование предусматривает наличие двух классов - делегатора и делегата. У делегатора объявляется свойство в классе, в которое можно записать делегат, реализующий определенный протокол. Мне не ясно какой объект производит запись в это свойство адрес делегата. Я так понимаю существует всего два варианта.
1) Это делает сам делегат;
2) Это делает третий какой-то внешний объект.
Какой вариант чаще используется в реальной практике программирования на Objective-C и какие могут быть еще варианты?
Также хотелось бы узнать: делегат должен всегда знать о своем делегаторе, т.е. он всегда должен иметь в своем классе поле ссылающееся на делегатор?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2015, 13:43     Делегирование
Посмотрите здесь:

Web Делегирование домена
Делегирование C#
Делегирование C++
делегирование dns
Делегирование Java SE
Objective-C Подскажите как лучше поступить(делегирование,дефайн.)
Делегирование массива
Objective-C Не понимаю делегирование
C++ Builder Делегирование события
Делегирование прав доступа Oracle
Делегирование
Делегирование событий jQuery

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
01.03.2015, 02:22     Делегирование #2
чаще всего это делает сам делегат, т.е. представляет себя делегатом другого класса и в большинстве случаев вы будете делать именно так
конечно, могут встречаться случаи с каким-то адапторами, которых вы хотите сделать делегатами и пусть они разгребают рутину того или иного делегатора, а вам отдают только какие-то наиболее важные ивенты, но тогда скорее всего вы станете делегатом адаптора и т.д

короче чтобы особо не заморачиваться в частных случаях, обычно сам класс знает, что он хочет слушать чьи-то ивенты и сам на них подписывается, иначе в чем тогда будет его суть, если неизвестно кто и когда подпишет его на какого-то делегатора

Насчет обязательности присутствия поля ссылающегося на делегатор, то не всегда, именно по-этому есть практика, чтобы делегатор передавал первым параметром себя в методы, которые он кому-то делегирует

Яркий пример с UITableView, т.е вы можете в InterfaceBuilder добавить табличку и указать, что ее делегатом будет File's Owner, т.е. ваш вью-контроллер.
При этом вам совсем не обязательно иметь ссылку на табличку в этом вью-котроллере, просто реализуете методы UITableViewDelegate и все, при этом первым параметром в них вам приходит как раз та самая табличка
Кстати с UITableViewDatasource такая же история.

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

P.S.

И одна из прекраснейших особенностей этого шаблона, это то, что он диктует создание отдельного протокола, чтобы его было легко реюзать, и это то, что программисты часто заучивают и не учатся применять на других своих случаях. Т.е. заучили, что для делегата нужен отдельный протокол, чтобы описать отдельное поведение и потом его переиспользовать,а для остальных случаев все так же пишут тонны кода и god-классы, но ладно, это уже отдельная песня.
rom85ich
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 16
01.03.2015, 10:50  [ТС]     Делегирование #3
Цитата Сообщение от Vorona Посмотреть сообщение
короче чтобы особо не заморачиваться в частных случаях, обычно сам класс знает, что он хочет слушать чьи-то ивенты и сам на них подписывается
Скажите, а подписка делегата на ивенты делегатора производится только в init-методе делегата или ее можно реализовать также в любом другом методе делегата?
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
01.03.2015, 20:02     Делегирование #4
производится там, где это удобно, например во вью-контроллерах вы будете создавать ui-элементы на viewDidLoad и соответсвенно там и подписываться, либо нужно показать алерт - создаете, подписываетесь, показываете
если делегатор передается в init-метод и будет актуален во время всей жизни объекта, то подписываетесь в init'е
rom85ich
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 16
02.03.2015, 15:48  [ТС]     Делегирование #5
А бывает двунаправленное делегирование? Т.е. допустим есть два класса. Ивенты первого класса обрабатывает второй класс и соответственно ивенты второго класса обрабатывает первый класс. Встречается такое в реальной практике программирования?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
02.03.2015, 15:59     Делегирование #6
rom85ich, бывает всякое. Например в UI - обычная master-details заготовка Xcode в любом более вменяемом приложении так и работает.
Делегирование ли там или блоки или уведомления это уже другой вопрос.
Yandex
Объявления
02.03.2015, 15:59     Делегирование
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru