【问题标题】:Objective-C delegates vs Java listenersObjective-C 委托与 Java 监听器
【发布时间】:2011-08-31 11:05:49
【问题描述】:

我读过很多关于 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)。如果我以正确的方式考虑这一点,那么代表似乎就像听众一样。那是对的吗?有什么大的不同吗?

谢谢!

【问题讨论】:

    标签: java objective-c cocoa delegates listener


    【解决方案1】:

    你几乎是在按钮那里。唯一真正的区别是 obj-c 中的委托通常实现多个功能,以对有关他们委托的对象的事件执行各种操作。例如, UITextViewDelegate 有方法:

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

    我发现唯一真正的区别是您不能像在 java 中那样内联创建委托:

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

    【讨论】:

    • 从技术上讲,使用块,您可以制作内联代表。我的硬盘驱动器上有一个实用程序类...
    • 哦,真的,我在我正在开发的应用程序中寻找类似的东西,以避免只为一个委托函数创建一个全新的类。我很想看看你是怎么做到的
    • 给你:标题:pastebin.com/Gdg4nsAF 主要:pastebin.com/SGVGCB31。您需要为每个代表开设一堂课,但是当您需要很多课时,这有助于减少课程的数量。
    • 你有一个你如何使用它的例子吗?我不确定我是否理解代码。
    • Swift 委托是否也与 Java 监听器相同?
    【解决方案2】:

    它们相似,但不相同。委托模式具有更广泛的定义,并且通常是实现定义的任务,这些任务可以超出单独的聆听范围。任务可以包括监听,或者委托的实现可以定义为监听(排他地)。

    objc 委托通常用于避免子类化,并用作侦听器或数据提供者。委托的作用由协议定义 - 它可以提供比监听器更多的功能。所以委托可以是数据源/提供者。它只是一种将实现卸载到另一个类的方法,从类中删除经常定制的、特定于应用程序的实现。

    NSButton/UIButton 已经通过目标+动作机制专门用于这种情况。对于这种特定情况,您可以使用 target+action。

    【讨论】:

      【解决方案3】:

      Delegate 类似于监听器或观察者,协议类似于接口,只是协议可以定义可选功能(也称为消息)。在 Objective C 中,您可以使用 category 扩充现有类(没有其源代码)以采用协议并使其成为委托,因此您根本不需要创建新的匿名内部类。你不能在 Java 中做到这一点。

      【讨论】:

        【解决方案4】:

        我认为在 java.util.concurrent 包中可以找到更好的 Java 模拟 .NET 委托:Callable、Future、Executor。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-25
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 2010-10-01
          相关资源
          最近更新 更多