我已经阅读了一些关于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)。如果我以正确的方式思考这个问题,那么代表就像听众一样。那是对的吗?有什么重大差异吗?
谢谢!
答案 0 :(得分:10)
你在按钮上几乎就是这样。唯一真正的区别是obj-c中的委托通常实现多个函数来对与其委托的对象有关的事件执行各种操作。例如,UITextViewDelegate具有以下方法:
– textViewShouldBeginEditing:
– textViewDidBeginEditing:
– textViewShouldEndEditing:
– textViewDidEndEditing:
我发现的唯一真正的区别是你不能像在java中一样创建你的代理内容:
someButton.setOnClickListener ( new View.OnClickListener {
@Override
public void onClick() {
//do stuff
}
});
答案 1 :(得分:7)
objc委托通常用于避免子类化,并用作侦听器或数据提供者。委托所做的是由协议定义的 - 它可以比监听器更多地起作用。所以委托可以是数据源/提供者。它只是一种将实现卸载到另一个类的方法,可以从类中删除经常定制的特定于应用程序的实现。
NSButton / UIButton已经通过目标+动作机制专门针对此案例。你会对这个具体案例使用目标+行动。
答案 2 :(得分:1)
Delegate与侦听器或观察者类似,协议类似于接口,但协议可以定义可选功能(aka消息)。在Objective C中,您可以使用类别来扩充现有类(没有其源代码)以采用协议并使其成为委托,这样您根本不需要创建新的匿名内部类。你不能用Java做到这一点。
答案 3 :(得分:0)
我认为在java.util.concurrent pagkage:Callable,Future,Executor中可以找到更好的Java模拟代表。