8

我正在编码接口。

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

有人告诉我,我可以通过用C扩展 B 来覆盖B 的功能,但我被要求既不触及B也不触及C,然后在配置文件中将B替换为C作为A的实现类。

我想我需要一个在A中不可用的方法,所以我需要向A添加一个可以在C中实现的方法。但我不允许触摸A

有人可以帮我解决怎么做吗?

谢谢。

编辑示例代码:

爪哇

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}
}

现在因为我不被允许触摸,A或者B我不得不编写另一个类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()C.java上添加一个方法同时使用引用变量我将无法调用,所以我必须在接口中声明为像那样使用它很好,但如果我这样做,我将不得不触摸我不允许触摸的东西。所以如何解决这个问题是我一直想问的。AA'sZ()void Z()AA

所以本质上,我将无法执行以下操作:

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

那么有什么方法可以让我在不触及 A 或 B 的情况下实现这样的目标吗?

4

6 回答 6

8

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

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

请注意,在极端情况下,您可以检查以下实例的类类型A

A foo;
// ...

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

但这真的很丑陋,并且违反了 OO 编程的许多基本规则。

于 2012-09-08T08:47:18.960 回答
1

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

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

于 2012-09-08T19:00:00.103 回答
0

所以,根据你刚才写的,你不能碰A,B,也不能碰C……所以,用D扩展C?

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

于 2012-09-08T06:07:55.773 回答
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)
    {
    }
}
于 2012-09-08T06:49:28.350 回答
0

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

于 2012-09-08T07:47:11.740 回答
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-创建了一个扩展 B 并实现 A 的类 C。

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

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

因此,您已经用 C 替换了 B,而没有在 C 中实现 X 和 Y 并对 B 进行更改。

输出 :

Something X
Something Y

希望这能回答你的问题。

于 2016-09-30T11:35:16.077 回答