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). Если я думаю об этом правильно, похоже, что делегаты так же, как и слушатели. Это верно? Существуют ли какие-либо существенные различия?
Спасибо!
Ответы
Ответ 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.