【问题标题】:Java 8 use one interface to implement methods in another [duplicate]Java 8使用一个接口在另一个接口中实现方法[重复]
【发布时间】:2020-06-21 18:01:35
【问题描述】:

抱歉,如果重复,不知道这个问题的正确术语,所以我没有找到任何人问类似的问题。

我有两个接口。让我们说犬和宠物。 宠物有一种玩法,是抽象的。 Canine 不会扩展 Pet。不过它有一个默认的播放方法,它与 Pet 的播放方法签名相匹配。

Dog 是一个实现 Canine 和 Pet 的类。 Dog 想使用 Canine 的默认播放方法。

我将如何干净利落地实现这一点?我看到的唯一方法是,如果我做了这样的傻事

class Dog implements Canine, Pet{
    public Dog(){
    }
    @Override
    public void play (String greeting) {
        Canine.super.play(greeting);
    }

}

interface Canine {
    default void play (String greeting) {
        System.out.println(greeting);
    }
}

interface Pet {
    void play (String greeting);
}

据我所知,在 C++ 中,您可以声明一个类使用方法的默认实现,而不是在所述类中实现它。有没有办法在 java 8 中做类似的事情?

【问题讨论】:

  • 让 Canine 扩展 Pet 并从 Dog 中移除 Pet 接口。
  • 嗯,这只是一个例子,我用相对名称替换了我正在处理的实际问题。我不能让 Canine 扩展 Pet,因为在这种情况下,canine 与 pet 无关,它只有一个共同的方法。狗既是犬类又是宠物,但犬类不是宠物。
  • 没有替代语法来表达这个特定的意图。您的解决方案是规范解决方案。
  • 我不同意 Holger 的观点,拥有多个具有相同方法签名的接口会在以后引起问题。假设您对 Canine 和 pet 的类型进行了 if-else 块测试。逻辑将进行第一次检查,但您可能希望在该上下文中进行第二次检查。我认为这是一个设计缺陷,将来会成为维护的噩梦。

标签: java inheritance java-8


【解决方案1】:

这已经是一种干净的方法。为了更清楚一点,请检查以下程序的输出,其中 Dog extends Animal 也有一个 play 方法,但在存在 Canine 的 default play 方法时不会被调用。

class Animal {
    public Animal() {
    }

    public void play(String greeting) {
        System.out.println("Before greeting in Animal");
        System.out.println(greeting);
        System.out.println("After greeting in Animal");
    }
}

class Dog extends Animal implements Canine, Pet {
    public Dog() {
    }

    @Override
    public void play(String greeting) {
        System.out.println("Before greeting in Dog");
        Canine.super.play(greeting);
        System.out.println("After greeting in Dog");
    }
}

interface Canine {
    default void play(String greeting) {
        System.out.println("Before greeting in Canine");
        System.out.println(greeting);
        System.out.println("After greeting in Canine");
    }
}

interface Pet {
    void play(String greeting);
}

public class Main {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.play("Hello");
    }
}

输出:

Before greeting in Dog
Before greeting in Canine
Hello
After greeting in Canine
After greeting in Dog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2013-12-01
    • 2022-12-03
    相关资源
    最近更新 更多