我正在编码接口。
我有一个接口 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}
}
现在因为我不允许接触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()
来做我的事情,但因为我正在编码接口A
如果我在上添加一个方法C.java 在使用A's
引用变量时,我将无法调用Z()
,因此我必须在void Z()
接口中声明A
以及使用它就是这样,但如果我这样做,我将不得不触摸A
这是我不被允许的。因此,如何解决这个问题是我一直想要问的问题。
基本上,我不能做以下事情:
A a = new C();
a.Z(); //can't do this
那么有没有办法让我在不触及A或B的情况下实现类似的目标?
答案 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
希望这能回答你的问题。