В чем смысл делегата на примере Objective-C?

Может кто простым языком объяснить? Смотрел стендфордские курсы, вроде все понятно, но вот с делегатами как то не сложилось.
  • Вопрос задан
  • 19022 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Paulskit
Рассматривайте делегат — как обычный обьект, который может выполнять некоторые функции. Например, возьмем NSTableView delegate. Вы хотите отрисовать ячейку таблицы как-то по своему. NSTableView своему делегату пошлет сообщение о том, что он сейчас будет рисовать данную ячейку и делегат уже сам решает что с ней делать (рисовать по своему, не трогать вообще и т.д.). Это, грубо говоря, способ получения и предоставления информации, о которой NSTableView не знает вообще ничего.
Или же пример создания собственных делегатов. Представьте, что у вас есть свой класс, который выполняет некоторую функцию. Для выполнения некоторых задач ему необходима информация из другого класса, о котором сейчас не известно ровным счетом ничего, кроме того, что он существует. Тогда создается конструкция вида:
@interface Class1 {
id delegate;
}

— (id)delegate;
— (void)setDelegate:(id)newDelegate;

@implementation Class1

— (id)delegate {
return delegate;
}

— (void)setDelegate:(id)newDelegate {
delegate = newDelegate;
}

Как видно из примера — наш делегат, это просто указатель на какой-либо обьект. Ну и предоставлены геттер и сеттер. Для того, чтобы делегат выполнил некоторое действие для нас, где-то внутри нашего Class1 мы пошлем сообщение вида [delegate doSomeWork];
Обьект же, который мы назначили делегатом для данного класса в свою очередь получит это сообщение и начнет выполнять какое-то действие.
В принципе и все. Достаточно просто.
Ответ написан
Комментировать
@petrovi4
Хорошее объяснение непосредственно делегатов и именно в Objective-C:
www.youtube.com/watch?v=ZhO4FmajxgM
Ну и абзац в документации Apple тоже хорошо описывает работу делегатов: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18
Ответ написан
@bsboris
Делегирование преследует простую цель — разделить ответственность между объектами, чтобы каждый занимался своим делом, при этом сохраняя объекты слабо связанными. Таким образом вы можете отправлять сообщения делегату, не зная какой именно это объект. А сам делегат, при этом, может выполнять разные действия в зависимости от своей реализации. Так что тут мы имеем одно из применений полиморфизма.

То есть, грубо говоря, делегирующий объект говорит объекту-делегату ЧТО делать, но его не волнует КАК именно это будет сделано.

Плюс, делегирование порой может быть более удобной альтернативой наследованию — вместо того, чтобы плодить иерарию классов вы определяете необходимый интерфейс для делегатов и используете их.
Ответ написан
Комментировать
@MikhailEdoshin
Делегат — способ организации callback'ов/обработки сообщений. Сразу видно, какие сообщения можно обработать, код собирается в одном месте и т. п. Например, в Win32 вместо делегата пишется свой обработчик сообщений, который фильтрует нужные, а для остальных вызывает процедуру по умолчанию; в Cocoa процедура по умолчанию выполняется всегда, но если есть делегат, она передает некоторые сообщения ему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы