使用抽象类将方法添加到接口

时间:2014-09-09 14:17:56

标签: java

我想在接口中添加一个方法,但我不想重写所有的实现(我只需要在一个或两个实现中使用它)。我读到我可以使用抽象类来实现这一点,但我无法弄清楚它是如何完成的?

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。

5 个答案:

答案 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设计人员可以自由地为其界面添加更多方法,而不会破坏现有的实现。

如需参考,请参阅MouseListener interfaceMouseAdapter class

答案 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();
}