考虑以下两个具体类:
public class A {
protected void foo() {
System.out.println("A foo");
bar();
}
protected void bar() {
System.out.println("A bar");
}
}
public class B extends A {
@Override
protected void foo() {
super.foo();
System.out.println("B foo");
}
@Override
protected void bar() {
System.out.println("B bar");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.foo();
}
}
输出将是:
A foo
B bar
B foo
正确。但是,如果我们需要结果,那该怎么办呢?
A foo
A bar
B foo
我们必须覆盖这两种方法。
Java Object模型中是否有解决方案?
答案 0 :(得分:3)
您应该使用合成而不是继承。 例如
public class Test {
public static void main(String[] args) {
B b = new B(new A());
b.foo();
}
}
class A implements Parent {
public void foo() {
System.out.println("A foo");
bar();
}
public void bar() {
System.out.println("A bar");
}
}
interface Parent {
void foo();
void bar();
}
class B implements Parent {
Parent wrapped;
public B(Parent p) {
this.wrapped = p;
}
@Override
public void foo() {
wrapped.foo();
System.out.println("B foo");
}
@Override
public void bar() {
System.out.println("B bar");
}
}
答案 1 :(得分:1)
从internalBar()
调用私有A.foo()
方法,而不是调用可覆盖的bar()
。 A.bar()
方法默认情况下也可以调用internalBar()
(以避免代码重复),并且仍会在子类中重写。
答案 2 :(得分:0)
如果在bar()
课程中执行B
不是问题,您可以在其中使用super.bar()
。