如何扩展接口

时间:2012-09-08 06:05:20

标签: java design-patterns inheritance interface

我正在编码接口。

我有一个接口 A 和一个实现它的 B 类。

我被告知我可以通过 C 扩展 B 功能,但我要求不要触及 B C ,然后将 B 替换为 C 作为配置文件中 A 的实现类。

我认为我需要一种 A 中没有的方法,所以我需要在 A 中添加一个方法,我可以在 C << / strong>即可。但我不允许触摸 A

有人可以帮助我完成它吗?

感谢。

修改示例代码:

A.java

public interface A {
    void X();
    void Y();
}

B.java

public class B implements A {
    public void X() {//something interesting}
    public void Y() {//something not very interesting}
}

现在因为我不允许接触AB我必须写另一个班级C并从B扩展它来做我的事情。

C.java

public class C extends B {
    public void Y() {//overriding B's not very interesting Y and making it interesting}
}

现在我需要在 C.java 中使用另一种方法void Z()来做我的事情,但因为我正在编码接口A如果我在上添加一个方法C.java 在使用A's引用变量时,我将无法调用Z(),因此我必须在void Z()接口中声明A以及使用它就是这样,但如果我这样做,我将不得不触摸A这是我不被允许的。因此,如何解决这个问题是我一直想要问的问题。

基本上,我不能做以下事情:

A a = new C();
a.Z(); //can't do this

那么有没有办法让我在不触及A或B的情况下实现类似的目标?

6 个答案:

答案 0 :(得分:7)

我想我明白你想要什么。您有以下内容:

public interface A {
  // can't touch this
}

public class B implements A {
  // can't touch this
}

public class C extends B {
  // you want to add your own method
  void someNewMethod();
}

// And you wish to do this:
A foo = new C();
foo.someNewMethod();

如果这是你想要的,那么恐怕无法做到。使用A的任何人都只知道A中定义的方法;他们不会知道您在班级someNewMethod()中定义了C。您需要被允许更改A

请注意,在extremis中,您可以检查A的实例的类类型:

A foo;
// ...

if (foo instanceof C) {
  ((C) foo).someNewMethod();
}

但那真的很难看并打破了OO编程的许多基本规则。

答案 1 :(得分:1)

我不知道你是否被允许这样做,但你可以扩展接口和类,你可以这样做:

公共接口A2扩展A {     public void mySuperVeryInterestingNewMethod(); }

答案 2 :(得分:0)

所以,根据你刚写的内容,你不能触及A,B或C ...所以,用D扩展C?

然后你可以添加你需要/想要的任何方法。

答案 3 :(得分:0)

你的问题根本不清楚。这是你的意思还是你想要的?

public interface InterfaceA
{

}

public class ClassB implements InterfaceA
{

}

public class ClassC extends ClassB
{

}

public class ClassD extends ClassC
{

}

public class Main
{
    protected InterfaceA A;

    public Main()
    {
        //A = new ClassB();
        A = new ClassD();
    }


    public static void main(String[]args)
    {
    }
}

答案 4 :(得分:0)

如果该方法是支持性的,则无需将其添加到接口以实现它。如果在其他地方使用它,则B实现另一个接口D.

答案 5 :(得分:0)

这可能会解决您的问题:

package test;

public interface A {

    void X();
    void Y();

}


package test;

public class B implements A{

    @Override
    public void X() {

        System.out.println("Something X");

    }

    @Override
    public void Y() {

        System.out.println("Something Y");
    }



}

package test;

public class C extends B implements A{

    public static void main(String[] args) {

        A a=new C();
        a.X();
        a.Y();

    }

}

根据您的要求

1 - 您已创建界面A。

2 - 创建了一个实现A的B类。

3 - 创建了一个C类,它扩展了B并实现了A。

4- A a = new C()将创建A类型的引用变量,但在运行时它将保存C的对象。

由于您无法触摸B和C,因此签名是相同的,并且您使用C的对象从B调用X()和Y(),因为它扩展了B。

因此,您已将B替换为C而未在C中实现X和Y并对B进行更改。

输出:

Something X
Something Y

希望这能回答你的问题。