我面临的问题如下 -
我正在使用第三方库,比如说编辑器,它有一个界面 EditorActions ,带有方法 -
创建(),编辑(),删除()。
我不想在我的实现中公开 EditorActions 的方法。所以我的界面会有像 -
这样的方法myCreate(),myEdit(),myDelete(),它们应该调用EditorActions方法。
EditorActions只是一个接口,实现是库的内部。
如何在不实现其中任何一个的情况下链接2个接口?
感谢您的所有帮助
答案 0 :(得分:2)
您可以通过公开希望人们在抽象类中使用的方法来实现此目的。然后强迫人们实现您希望他们使用的特定方法。
然后,您可以使用EditorActions
界面中的方法以及强制实施的方法。
public abstract class AbstractEditorActions {
private EditorActions ea;
public AbstractEditorActions(EditorActions ea) {
this.ea = ea;
}
// In this method, you can use the methods
// from the interface and from this abstract class.
// Make the method final so people don't break
// the implementation.
public final void yourExposedMethod() {
// code
this.toImplement();
ea.doMethod();
}
protected abstract toImplement();
}
答案 1 :(得分:0)
假设您从库中获得EditorActions
的实例,您可以这样做:
public class FooActions implements MyEditorActions, EditorActions{
private EditorActions internal;
public FooActions(EditorActions internal){
this.internal = internal;
}
@Override
public void create(){
internal.create();
}
@Override
public void myCreate(){
// do stuff
this.create();
}
}
这样做是用一个实现相同接口的对象包装库对象的实例。然后,您只需将对象公开为您想要的任何接口。
EditorActions a1 = new FooActions(); // a1 only shows library methods
MyEditorActions a2 = a1; // now a2 only shows your methods
答案 2 :(得分:0)
如何在不实现其中任何一个的情况下链接2个接口?
你做不到。你想在这里做自动魔术。不要做魔法。无论如何,你必须实现其中任何一个。
或者,你必须实现自己的反射管道(或某种方式的AOP)来动态创建类。后者不是一种琐碎的方式,通常是一种过度杀伤和过度工程的红旗,只是为了避免实现相当于普通的delegate。
OTH,如果您只想“公开”第三方接口 A 提供的方法的子集(例如,只有getter方法),您几乎可以轻而易举地创建(通过良好的旧肘部油脂或反射库)接口 B ,只暴露您想要的方法子集。
interface DirtyThirdPartyInterface { StupidCrap getSomeStupidCrap(); void setStupidCrap(); }
接口MySanitizedInterface { StupidCrap getSomeStupidCrap(); // setter不是此接口的一部分 }
然后使用Spring AOP或类似的东西或其中一个反射库,那么你可以自动生成MySanitizedInterface的实现作为AOP拦截器,它只是代理对getter的调用(通过反射)来第三方界面中的吸气剂。
但是,再次,这是很多废话(更不用说第三方库依赖),简单地避免简单的手工编码。很难找到一个真实的案例来证明所有管道工具的合理性。如果我遇到类似的事情,我会想到的第一件事就是“红旗”。 YMMV当然。