【发布时间】: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