我想在接口中添加一个方法,但我不想重写所有的实现(我只需要在一个或两个实现中使用它)。我读到我可以使用抽象类来实现这一点,但我无法弄清楚它是如何完成的?
Inteface:
public interface Animal {
public void doSound();
}
类:
public class Cat implements Animal {
@Override
public void doSound() {
System.out.print("meow");
}
}
public class Dog implements Animal{
@Override
public void doSound() {
System.out.print("bark");
}
}
我想要的是能够打电话
animal.doSomethingElse()
但我不想将此方法添加到每个实现中。可以这样做吗?
编辑: 之前应该提到过,我不是在使用java 8。
答案 0 :(得分:3)
您可以将Animal
更改为抽象类。这将使您能够有选择地实现方法:
public abstract class Animal {
public abstract void doSound();
public void doSomethingElse() {
}
}
答案 1 :(得分:3)
在Java 8中可以借助界面中的默认方法。
public interface Animal {
void doSound();
default void doSomethingElse(){
// do something
}
}
如果是默认方法,您在Animal中实现的类不必覆盖它们。
在java 8之前,你必须将Animal类抽象化并在那里添加方法实现。
答案 2 :(得分:2)
不幸的是,没有:您无法在不重新编译接口的所有实现的情况下向接口添加方法。
您可以向抽象类添加方法,并使用对抽象类的引用更改对该接口的所有引用。然而,这首先打破了界面的目的。
最后,在Java 8中,您可以通过在接口中提供方法的默认实现来解决此问题。如果Java 8是一个选项,我肯定会推荐这条路线。
如果您希望将来避免这样的问题,您可以遵循Java设计人员在AWT框架中遵循的接口+适配器模式(以及其他地方)。它们将提供一对接口及其默认的无操作实现。鼓励每个人编程到接口,并将其接口的实现基于其默认实现对应物(适配器)。通过这种方式,Swing设计人员可以自由地为其界面添加更多方法,而不会破坏现有的实现。
答案 3 :(得分:2)
Java不可能包括7版本。 您可以将Animal定义为抽象类,并在其中实现新方法。示例代码如下:
public abstract class Animal {
public abstract void doSound();
public void doSomethingElse() {}
}
但是,如果您使用的是Java 8,则可以使用称为默认方法的机制。以下示例
public interface Sample {
public abstract void doSound();
public default void doSomethingElse() {};
}
默认方法不必由类实现。当涉及到实现某些接口的大量类的接口时,机制非常有用。您可以在不更改所有类的情况下扩展它
答案 4 :(得分:0)
您可以将Animal扩展为单独的接口或抽象类。
public interface Pet extends Animal {
public void fetch();
}
或
public abstract class Pet implements Animal {
public abstract void fetch();
}