可以使用默认方法实现来实现基类中的抽象方法吗class
Can a default method implementation be used to implement an abstract method in a base class
如果我有一个带有抽象方法的class:
abstract class Base {
abstract void foo();
}
和一个接口,它使用默认实现声明相同的方法:
interface Inter {
default void foo() {
System.out.println("foo!");
}
}
我是否需要在 class 中提供一个实现 implements/extends 两者?
class Derived extends Base implements Inter {
}
这似乎应该可行,但我收到一个编译错误,指出 Derived
不是抽象的并且没有覆盖抽象方法 foo
。
我猜测 class 中的抽象方法比接口中的默认方法 "more important"。
有什么好的方法可以做到这一点吗?
我的根本问题是我有一个三级抽象 class 层次结构(A
和 B
扩展 C
、D
和 E
extend F
, C
and F
extend G
), 这将有叶 classes 的多个实现。在每组实现中,有一些正在实现的通用方法定义在基础 classes 中,所以我希望写成
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() { ... }
}
只需调用您具体的默认方法 class:
@Override
public void foo() {
Inter.super.foo();
}
如果我有一个带有抽象方法的class:
abstract class Base {
abstract void foo();
}
和一个接口,它使用默认实现声明相同的方法:
interface Inter {
default void foo() {
System.out.println("foo!");
}
}
我是否需要在 class 中提供一个实现 implements/extends 两者?
class Derived extends Base implements Inter {
}
这似乎应该可行,但我收到一个编译错误,指出 Derived
不是抽象的并且没有覆盖抽象方法 foo
。
我猜测 class 中的抽象方法比接口中的默认方法 "more important"。
有什么好的方法可以做到这一点吗?
我的根本问题是我有一个三级抽象 class 层次结构(A
和 B
扩展 C
、D
和 E
extend F
, C
and F
extend G
), 这将有叶 classes 的多个实现。在每组实现中,有一些正在实现的通用方法定义在基础 classes 中,所以我希望写成
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() { ... }
}
只需调用您具体的默认方法 class:
@Override
public void foo() {
Inter.super.foo();
}