简体   繁体   English

可以使用默认方法实现来在基类中实现抽象方法

[英]Can a default method implementation be used to implement an abstract method in a base class

If I have a class with an abstract method: 如果我有一个抽象方法的类:

abstract class Base {
    abstract void foo();
}

and an interface that declares the same method with a default implementation: 和一个使用默认实现声明相同方法的接口:

interface Inter {
     default void foo() {
         System.out.println("foo!");
     }
}

do I need to provide an implementation in a class that implements/extends both? 我是否需要在实现/扩展两者的类中提供实现?

class Derived extends Base implements Inter {

}

It seems like this should work, but I get a compilation error that Derived is not abstract and does not override the abstract method foo . 看起来这应该工作,但我得到一个编译错误, Derived不是抽象的,不会覆盖抽象方法foo

I am guessing that the abstract method from the class is "more important" than the default method from the interface. 我猜这个类中的抽象方法比界面中的默认方法“更重要”。

Is there a good way to make this work? 有没有一个很好的方法来使这项工作?

My underlying problem is that I have a three level abstract class hierarchy ( A and B extend C , D and E extend F , C and F extend G ), which will have multiple implementations of the leaf classes. 我的根本问题是我有一个三级抽象类层次结构( AB扩展CDE扩展FCF扩展G ),它将具有叶类的多个实现。 Within each set of implementations, there are common methods being implemented that are defined in the base classes, so I hoped to write 在每组实现中,有一些常用的方法在基类中定义,所以我希望写一下

abstract class C extends G {
     abstract void foo();
     abstract void bar();
     abstract void quz();
     void baz() {
         foo();
         bar();
     }
}

abstract class A extends C {
    void quz() { /* impl */ }
}
abstract class B extends C {
    void quz() { /* different impl */ }
}

interface C1 {
     default void foo() { /* impl for first set of classes */ }
}
class A1 extends A implements C1 {
     @Override void bar() { ... }
     // foo implementation from C1
}
class B1 extends B implements C1 {
     @Override void bar() { ... }
}

interface C2 {
     default void foo() { /* impl for second set of classes */ }
}
class A2 extends A implements C2 {
     @Override void bar() { ... }
     // foo implementation from C2
}
class B2 extends B implements C2 {
     @Override void bar() { ... }
}

Just call the default method from your concrete class: 只需从具体类中调用默认方法:

@Override
public void foo() {
    Inter.super.foo();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM