我有一个界面,有人承诺我会提供它的实现。
我现在必须设计一个类,我可以扩展“某人”的实现。但是我不知道该实现的名称。
例如
interface X{ void methodA(int); int methodB();}
class A implements X { /*impl code here*/}
现在,我不知道,哪个类将实现X.但我想将这些实现合并到我的代码中
class B extends <Anyclass that implements interface X>
{/*other impl here*/}
我该怎么做呢?我知道在泛型中你可以指定何时使用Comparator。我想知道这个案件是否有可用的东西?
答案 0 :(得分:2)
这是你的界面:
interface X{ void methodA(int); int methodB();}
制作抽象超类:
abstract class A implements X { /*impl code here*/}
现在B(以及扩展A的所有其他类)都承诺实现接口:
class B extends A {/*other impl here*/}
答案 1 :(得分:2)
所以你想要一个X实例,它与你在运行时获得的类具有相同的接口,但是允许你指定X的某些方法的行为?
如果在运行时有A
的实例,则可以使用proxy classes创建一个实现该类实现的所有接口的对象,包括X
,并覆盖一些X
执行所需操作的方法,并将其余部分委托给实例。
代理类的效率并不是很明显,它们提供的动态通常更容易通过更常规的方式实现,所以不要过度使用它们,但是需要在两个部分之间的边界处使用一些灵活的粘合剂。一个系统,他们真的可以提供帮助。
另请注意,生成的对象不是A,它只是实现与A相同的接口。
答案 2 :(得分:2)
你有没有理由想避免在这里作曲?没有名称,您将无法访问神秘实现。您无法扩展? extends X
,但您可以拥有它的实例。使用构图非常简单:
interface X
{
void methodA( int param );
int methodB();
}
class YourImpl<T extends X> implements X
{
private T delegate;
public YourImpl( T delegate )
{
this.delegate = delegate;
}
void methodA( int param )
{
delegate.methodA( param );
}
int methodB()
{
return delegate.methodB();
}
}
在这个例子中,你不会获得太多收益,但如果你在授权之前/之后进行额外的处理,那么可以获得很多。
一般来说,即使成分更合适,人们也会倾向于继承以解决他们的问题。我建议重新考虑一下合成是否适合你。另一件需要考虑的事情是神秘实现是否可以使用您的实现,而不是相反。
答案 3 :(得分:1)
我现在必须设计一个类,我可以扩展“某人”的实现。但是我不知道该实现的名称。
这是不可能的。 Java不允许您extend
泛型类型参数。您只能extend
一个命名类。
要实现您要实现的目标,您需要使用某种代理,委托或包装。例如:
public class B implements X {
private X x;
public B(X x) {
this.x = x;
}
// delegate each method in the X interface as required; e.g.
public int someMethod(String s) {
return x.someMethod(s);
}
// add any implementations of B-specific methods.
}
这不完全是“构图”,但我怀疑这是你想要避免的那种。不幸的是(对你来说),没有真正的选择。 Java语言和JVM 都要求除Object之外的每个类都有一个明确的超类。