父/子方法覆盖

时间:2014-11-22 06:38:56

标签: java polymorphism override method-overriding object-model

考虑以下两个具体类:

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模型中是否有解决方案?

3 个答案:

答案 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()