Java 如何扩展接口
我正在编码接口 我有一个接口A和一个实现它的类B 我被告知我可以通过C扩展B功能来覆盖B功能,但我被要求既不触摸B也不触摸C,然后在配置文件中将B替换为C,作为A的实现类 我想我需要一个在a中不可用的方法,因此我需要在a中添加一个可以在C中实现的方法。但是我不允许触摸A 有人能帮我做这件事吗 谢谢 编辑: 示例代码: A.javaJava 如何扩展接口,java,design-patterns,inheritance,interface,Java,Design Patterns,Inheritance,Interface,我正在编码接口 我有一个接口A和一个实现它的类B 我被告知我可以通过C扩展B功能来覆盖B功能,但我被要求既不触摸B也不触摸C,然后在配置文件中将B替换为C,作为A的实现类 我想我需要一个在a中不可用的方法,因此我需要在a中添加一个可以在C中实现的方法。但是我不允许触摸A 有人能帮我做这件事吗 谢谢 编辑: 示例代码: A.java public interface A { void X(); void Y(); } public class B implements A {
public interface A {
void X();
void Y();
}
public class B implements A {
public void X() {//something interesting}
public void Y() {//something not very interesting}
}
public class C extends B {
public void Y() {//overriding B's not very interesting Y and making it interesting}
}
B.java
public interface A {
void X();
void Y();
}
public class B implements A {
public void X() {//something interesting}
public void Y() {//something not very interesting}
}
public class C extends B {
public void Y() {//overriding B's not very interesting Y and making it interesting}
}
现在,因为我不允许触摸A
或B
,我不得不编写另一个类C
,并将其从B扩展到做我的事情
C.java
public interface A {
void X();
void Y();
}
public class B implements A {
public void X() {//something interesting}
public void Y() {//something not very interesting}
}
public class C extends B {
public void Y() {//overriding B's not very interesting Y and making it interesting}
}
现在我需要另一个方法void Z()
在C.java中来做我的事情,但是因为我正在为接口A
编码,如果我在C.java上添加一个方法,而使用A的
引用变量,我将无法调用Z()
,所以我必须声明void Z()
在A
界面中也可以这样使用,但如果我这样做,我将不得不触摸A
,这是不允许的。所以如何解决这个问题是我一直想问的
因此,从本质上讲,我不能做如下事情:
A a = new C();
a.Z(); //can't do this
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或B的情况下实现这样的目标呢?那么,根据你刚才写的,你不能碰A、B或C。。。那么,用D扩展C
然后你可以添加任何你需要/想要的方法。你的问题一点也不清楚。这是你的意思还是你想要的
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)
{
}
}
如果该方法是支持的,则不需要将其添加到接口来实现它。如果它在其他地方使用,那么B实现另一个接口D。我想我理解您想要什么。您具有以下功能:
A a = new C();
a.Z(); //can't do this
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
中定义的方法;他们不会知道您在类C
中定义了someNewMethod()
。需要允许您更改A
注意,在极端情况下,您可以检查A
实例的类类型:
A foo;
// ...
if (foo instanceof C) {
((C) foo).someNewMethod();
}
但这真的很难看,打破了OO编程的许多基本规则。我不知道是否允许您这样做,但您可以扩展接口和类,您可以这样做: 公共接口A2扩展了{ public void mySuperyInterestingNewMethod();
}这可能会解决您的问题:
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,所以签名是相同的,并且在扩展B时使用C的对象从B调用X()和Y()
因此,您将B替换为C,而没有在C中实现X和Y并对B进行更改
输出:
Something X
Something Y
希望这能回答您的问题。您的意思是:既不触摸A也不触摸Bplus:为什么您不能有一个不在界面中的方法?这不是Objective-C!是的,我知道这在ObjC中也是可能的,但在那里更常见。你不能碰A、B或C,必须用C的A实现来代替B?这是不可能的,除非您可以更改C或将C扩展为D并用新的D实现替换B。您不能在接口a之外添加一个新方法,并期望它被a的接口的默认使用者使用。好的,但您的实际意思是什么?我不能只触及
a
或B
。我创建了C
,因为我必须重写B
中实现的一些方法。问题是,我对接口进行编码,所以我使用了a
类型的引用变量,但是a
的实现类可以是B
或C
或D,但是我必须在a`fora
引用变量中声明我想要使用的新方法来调用该方法。我不能只需触摸A
或B
。我创建了C
,因为我必须重写B
中实现的一些方法。问题是,我对接口进行编码,所以我使用了a
类型的引用变量,但是a
的实现类可以是B
或C
或D,但是我必须在a`fora的
引用变量中声明我想要使用的新方法来调用该方法这里的问题是对接口A
进行编码。在客户端,我使用A的引用变量调用方法。我想我会遵循。您有一个类型为a的变量。您知道它是B,您需要调用不在a接口中的方法。您需要直接引用B而不是引用泛化A,或者尝试强制转换到B并处理错误强制转换这是可以做到的,但问题是我正在处理的应用程序有太多的A
实例,无法想象用A2
替换A
的所有实例。没有任何其他选项,因此我必须在接口A
本身中声明该方法。感谢您的回复:)。如果您按住ctrl键并单击/右键单击选项,Eclipse有一个“重构”选项。这并不难@跳过