Java8使用一个接口在另一个接口中实现方法
抱歉,如果重复,我不知道这个问题的正确术语,所以我没有发现有人问类似的问题 我有两个接口。比如说狗和宠物。 宠物有一个游戏的方法,这是抽象的。 犬科动物不延伸宠物。不过它有一个默认的播放方法,与宠物的播放方法签名相匹配 Dog是一个同时实现犬科和宠物的类。 狗想使用狗的默认游戏方法 我将如何干净地实施这一点?我唯一能看到的就是如果我做了这样愚蠢的事Java8使用一个接口在另一个接口中实现方法,java,inheritance,java-8,Java,Inheritance,Java 8,抱歉,如果重复,我不知道这个问题的正确术语,所以我没有发现有人问类似的问题 我有两个接口。比如说狗和宠物。 宠物有一个游戏的方法,这是抽象的。 犬科动物不延伸宠物。不过它有一个默认的播放方法,与宠物的播放方法签名相匹配 Dog是一个同时实现犬科和宠物的类。 狗想使用狗的默认游戏方法 我将如何干净地实施这一点?我唯一能看到的就是如果我做了这样愚蠢的事 class Dog implements Canine, Pet{ public Dog(){ } @Override
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++中,你可以声明一个类使用方法的默认实现,而不是在该类中实现它。在Java8中有没有类似的方法?这已经是一种干净的方法了。为了更清楚一点,请检查以下程序的输出,其中
Dog extensed Animal
,该程序也有play
方法,但在存在犬科的默认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
让犬科动物扩展宠物并从狗身上移除宠物界面。好吧,这只是一个例子,我用相对的名字替换了我正在处理的实际问题。我不能让狗扩展宠物,因为在这种情况下,狗和宠物无关,它只有一个共同的方法。狗既是犬科动物又是宠物,但犬科动物不是宠物。没有其他语法来表达这一特定意图。您的解决方案是规范解决方案。我不同意Holger的观点,拥有多个具有相同方法签名的接口将在以后导致问题。假设您对犬只和宠物的类型进行了if else块测试。逻辑将进行第一次检查,但您可能希望在该上下文中进行第二次检查。我认为这是一个设计缺陷,将来会成为维护的噩梦。