Делегаты Objective C против слушателей Java - PullRequest
18 голосов
/ 24 мая 2011

Я прочитал кучу статей и чтений о делегатах Objective-C, пытаясь понять их.Исходя из Java, они очень похожи на слушателей Java.Например, допустим, у меня была кнопка на Java.Когда кнопка нажата, я хочу, чтобы что-то случилось.Мой код может выглядеть примерно так:

ButtonListener myButtonListener = new ButtonListener();    
someButton.addActionListener(myButtonListener);
...

class ButtonListener implements ActionListener
{
   public void actionPerformed(ActionEvent e)
   {

    }
}

Что-то в этом роде.В target-c кажется, что я бы сделал что-то вроде вызова метода setDelegate для моей кнопки и передачи его «слушателю» в качестве делегата.Фактический класс кнопки затем, вероятно, проверит, ответил ли этот делегат какому-то селектору (т. Е. ActionPerformed).Если я думаю об этом правильно, кажется, что делегаты - это как слушатели.Это верно?Есть ли существенные различия?

Спасибо!

Ответы [ 4 ]

10 голосов
/ 24 мая 2011

Вы в значительной степени на кнопку там.Единственное реальное отличие состоит в том, что делегаты в obj-c обычно реализуют несколько функций для выполнения различных действий над событиями, касающимися объекта, который они делегируют.Например, UITextViewDelegate имеет методы:

– textViewShouldBeginEditing:
– textViewDidBeginEditing:
– textViewShouldEndEditing:
– textViewDidEndEditing:

Единственное реальное различие, которое я обнаружил, заключается в том, что вы не можете создавать своих делегатов встроенными, как в java, как:

someButton.setOnClickListener ( new View.OnClickListener {
    @Override
    public void onClick() {
        //do stuff
    }
});
7 голосов
/ 24 мая 2011

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

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

NSButton / UIButton уже специализировались для этого случая с помощью механизмов target + action.вы бы использовали target + action для этого конкретного случая.

1 голос
/ 19 октября 2012

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

0 голосов
/ 24 мая 2011

Я думаю, что лучший аналог Java для делегатов .NET можно найти в pagkage java.util.concurrent: Callable, Future, Executor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...