什么是Java相当于可可代表?
(我知道我可以传递给类的接口,并且具有类调用适当的方法,但我不知道是否有任何其他的方式来实现更接近于可可/ Objective-C的非正式协议)
什么是Java相当于可可代表?
(我知道我可以传递给类的接口,并且具有类调用适当的方法,但我不知道是否有任何其他的方式来实现更接近于可可/ Objective-C的非正式协议)
简短的回答是没有什么用Java接近你想,但也有替代品。 委托模式并不难实现,但它只是并不像与Objective-C的做起来一样方便。
在Objective-C的原因“非正式协议”的工作是因为语言支持类 ,它允许你添加方法,现有的类没有子他们,甚至无需访问源代码。 因此,大多数非正式协议是NSObject的上一个类别。 这在Java中显然是不可能的。
客观-C 2.0 OPTS为@optional协议方法,这是一种更清洁的抽象和优选为新的代码,但即使进一步从具有Java中的等价物。
老实说,最灵活的方式是定义一个委托协议,则有类实现的所有方法。 (随着现代的IDE像Eclipse,这是微不足道的。)许多Java接口有一个附带的适配器类,而这是不要求用户实施了大量的空方法的常用方法,但是它限制了继承,这使得代码设计呆板。 (乔希布洛赫在他的著作“有效的Java”解决了这个。)我的建议是只先提供一个接口,然后添加适配器,如果它是真正必要的。
不管你做什么,避免抛出一个UnsupportedOperationException
为“未实现”的方法。 这迫使委托类来处理例外,应该是可选的方法。 正确的做法是实现什么都不做,返回默认值,等等。这些价值观应该有据可查对于不具有void返回类型的方法的方法。
最好的模拟一个非正式协议,我能想到的是,也有一个适配器类,允许实施者,以避免执行每一个方法的接口。
public class MyClass {
private MyClassDelegate delegate;
public MyClass () {
}
// do interesting stuff
void setDelegate(MyClassDelegate delegate) {
this.delegate = delegate;
}
interface MyClassDelegate {
void aboutToDoSomethingAwesome();
void didSomethingAwesome();
}
class MyClassDelegateAdapter implements MyClassDelegate {
@Override
public void aboutToDoSomethingAwesome() {
/* do nothing */
}
@Override
public void didSomethingAwesome() {
/* do nothing */
}
}
}
这时,有人可以一起去,只是实现他们关心的内容:
class AwesomeDelegate extends MyClassDelegateAdapter {
@Override
public void didSomethingAwesome() {
System.out.println("Yeah!");
}
}
要么,或纯反射主叫“已知”的方法。 但是,这是疯了。
没有什么在你的Java对象使用委托模式阻止你(这只是一个不常用的JDK模式就像是可可)。 只要有一个delegate
符合你的类型的伊娃WhateverDelegate
接口,然后在您的实例方法,您想委派,转发方法调用到委托对象,如果它的存在。 你可能会用的东西,看起来很像落得这样 ,除Java之外代替的OBJ-C。
至于可选接口去,那会比较困难。 我建议,宣布接口,宣称实现了可选的方法作为空方法的抽象类,然后继承抽象类,覆盖想要这个特殊的对象来实现所有可选方法。 这里有一个潜在的严重限制,由于缺乏在Java中多重继承的,但是这是亲如我能想出。