[英]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. 我的根本问题是我有一个三级抽象类层次结构(
A
和B
扩展C
, D
和E
扩展F
, C
和F
扩展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.