![]() |
1
8
简短的回答是,Java中没有任何你想接近的东西,但还有其他选择。委托模式并不难实现,只是不如使用Objective-C来实现它那么方便。 “非正式协议”在Objective-C中起作用的原因是语言支持 类别 它允许您将方法添加到现有的类中,而无需对它们进行子类化,甚至可以访问源代码。因此,大多数非正式协议都是NSOBJECT上的一个类别。这在Java中显然是不可能的。 Objul-C 2选择了“可选协议”方法,这是一种更干净的抽象,对于新代码更为可取,但在爪哇中也有更大的等价性。 老实说,最灵活的方法是定义委托协议,然后让类实现所有方法。(使用像伊柯丽斯这样的现代IDE,这是微不足道的)。许多Java接口都有一个附带的适配器类,这是一种不需要用户实现许多空方法的通用方法,但是它限制继承,这使得代码设计不灵活。(Josh Bloch在他的书《有效Java》中提到了这一点。我的建议是先提供一个接口,然后在需要的时候添加一个适配器。
无论你做什么,都要避免
|
![]() |
2
5
我能想到的对非正式协议的最佳模拟是一个接口,它还具有一个适配器类,允许实现者避免实现每个方法。
然后有人可以过来执行他们关心的事情:
或者是调用“已知”方法的纯反射。但那太疯狂了。 |
![]() |
3
2
没有什么可以阻止您在Java对象中使用委托模式(它不是JDK中常用的模式,就像它在COCOA中那样)。只要有一个
就可选接口而言,这将更加困难。我建议声明接口,将实现可选方法的抽象类声明为空方法,然后对抽象类进行子类化,重写希望此特定对象实现的可选方法。由于Java中缺少多重继承,这里有一个潜在的严重限制,但这和我能想到的一样接近。 |
|
user8040474 · 网络连接不工作 7 年前 |
![]() |
Genhain · swift中链式泛型类型推断闭包 7 年前 |
![]() |
Joe · 将数据从子VC传回集合视图单元格 7 年前 |
![]() |
NaderBesada · 协议字典Swift 4 7 年前 |
![]() |
Marmelador · 通过协议更改代理的属性 7 年前 |