在java中如何扩展接口的实现?

时间:2011-05-28 00:15:54

标签: java inheritance implementation

我有一个界面,有人承诺我会提供它的实现。

我现在必须设计一个类,我可以扩展“某人”的实现。但是我不知道该实现的名称。

例如

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。我想知道这个案件是否有可用的东西?

4 个答案:

答案 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之外的每个类都有一个明确的超类。