Подтвердить что ты не робот

Objective-C делегаты против прослушивателей Java

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

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

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

    }
}

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

someButton.setOnClickListener ( new View.OnClickListener {
    @Override
    public void onClick() {
        //do stuff
    }
});

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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