抱歉,如果重复,不知道这个问题的正确术语,所以我没有发现有人提出类似的问题。
我有两个接口。让我们说狗和宠物。宠物有一个游戏方法,这是抽象的。狗不伸长宠物。不过,它有一个默认的play方法,它与Pet的play方法签名相匹配。
狗是一个同时实现犬类和宠物的类。狗喜欢使用狗的默认游戏方法。
我该如何干净利落地实现这一点呢?我唯一能看到的就是如果我做了这样的傻事
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中有类似的方法吗?
发布于 2020-03-09 20:11:51
这已经是一种干净的做法。为了让它更清楚一点,请检查下面程序的输出,其中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 Doghttps://stackoverflow.com/questions/60607468
复制相似问题