【问题标题】:Objective-C Delegation Explained to a Java Programmer向 Java 程序员解释 Objective-C 委托
【发布时间】:2010-10-01 11:14:14
【问题描述】:

我对 Objective-C 比较陌生,但在 Java 方面经验丰富。 Java中是否有Objective-C“委托”的等效概念,以便我可以更好地理解这个概念?有没有办法在 Java 中模拟委托概念?

【问题讨论】:

    标签: java objective-c delegation


    【解决方案1】:

    委托只是一种避免将对象(如表视图)子类化以实现应用程序特定行为的方法,而是将责任交给控制器。当您创建表视图时,您为其分配一个控制器对象,该对象实现一组定义的方法(一些可能是必需的,其他可能是可选的)。当 table view 需要数据或必须决定如何显示自己时,它会询问委托是否实现了适当的方法,如果实现则调用它来做出决定。

    【讨论】:

    • 谢谢。在您的示例中,您正在为控制器提供委托。该委托包装了表视图将与之交互的控制器。正确的?在 Java 中,您将让委托实现与常规控制器相同的接口。 Objective-C 中有这个概念吗?
    • 我说的不完全是,它没有包装控制器,这更像是一个子类。委托所做的是回答有关 tableViewController 对象的一种用途与另一种用途有何不同的问题,即 tableViewController 并不总是具有相同数量的单元格,因此委托将具有控制器将调用的必需方法 -numberOfCells要确定有多少个单元格,那么它将使用 -cellAtIndex:(int)index 之类的内容向代表询问每个单元格。这里的诀窍是表格视图没有子类化。
    【解决方案2】:

    这是一种考虑委托的方式 - 在 OOP 典型示例中,我有一个汽车对象。我不想再继承它,我只想按原样使用它,那么我如何让它像雪佛兰或野马一样?我给它一个委托。

    我的车会有驾驶方法、鸣喇叭等方法。

    我的代表会使用诸如“我的最高速度是多少”和“喇叭听起来像什么”和“我的窗户有颜色”这样的方法

    所以当我在我的汽车对象(不是子类)上调用 -drive 时,该方法调用我的委托的 topSpeed 方法,委托告诉它 120mph,所以汽车知道它应该开多快,而不必是野马。

    在 Objective C 中,通常有一个协议定义委托应响应的内容,即对于我的汽车对象的委托,将有一个像这样声明的协议:

     @protocol carDelegate
    
     -(int)carTopSpeed;
     -(UIColor*)carColor;
     -(BodyShape*)carBodyShape;
     -(DragCoefficient*)carDragCoefficient;
     -(HoodOrnament*)carHoodOrnament     
    
     @optional
     -(BOOL)windowsTinted;
    
     @end
    

    然后您可以制作符合此协议的自己的对象(实现所有必需的方法,以及任何被视为需要的可选方法)

    汽车对象会期望一个 (id) 作为委托传递给它。

    那么汽车对象已经设法避免被子类化,并且仍然可以根据用户的需要进行操作。

    【讨论】:

    • 为什么-drive 会调用-topSpeed?我没有看到连接
    • 假设 Car 对象有点像演员,而 carDelegate 有点像导演。我们不是子类化演员,而是让演员询问导演如何表演,然后您创建自定义导演。因此,当您要求汽车行驶时,汽车会询问代表它应该开多快。
    【解决方案3】:

    java.lang.reflect.Proxy 是 java 中最接近的等价物。虽然使用起来很乏味。

    【讨论】:

    • java.lang.reflect.Proxy 用于在 runtime 创建 Java 代理/包装/代理。这对 Objective-C 代表来说是真的吗?它们是运行时而不是编译时的概念?
    【解决方案4】:

    委托是一种面向对象的设计模式。 Wikipedia 上有一个 Java 示例:Delegation Pattern

    【讨论】:

    • 感谢您的链接。是否真的像用另一个对象包装一个对象一样简单——并公开这些相同的方法,但行为(稍微)不同?我对委托的(非常有限的)理解是,它更像是 Objective-C 中的一流概念。
    • 不是头等舱。这只是 Cocoa 中常见的设计模式。它没有什么特别之处。
    • 这在 Objective C 中更容易做,因为它更容易检测任意对象是否有你想要调用的方法(而不是方法,它实际上被称为“选择器”),这使得易于使用包含对象的可选方法(被包装的对象通常称为“委托”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多