java – 父/子方法覆盖

考虑以下两个具体类:

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");
}

}
上一篇:c# – 通过接口进行静态属性访问


下一篇:java – 如何使用JDK7的invokedynamic实现多态