考虑以下两个具体类:
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模型中是否有任何解决方案?
解决方法:
您应该使用组合而不是继承.
例如
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");
}
}