Задать вопрос

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

Может кто простым языком объяснить? Смотрел стендфордские курсы, вроде все понятно, но вот с делегатами как то не сложилось.
  • Вопрос задан
  • 19023 просмотра
Подписаться 11 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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 процедура по умолчанию выполняется всегда, но если есть делегат, она передает некоторые сообщения ему.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы