java类A扩展了类B和方法覆盖

时间:2012-05-18 03:06:15

标签: java class override extends

public class A {
   protected ClassX a;
   public void foo() {
       operations on a;
   }
}

public class B extends A {
   private ClassY b; // ClassY extends ClassX
   @Override
   public void foo() {
       //wanna the exact same operation as A.foo(), but on b;
   } 
}

很抱歉这样一个不太明确的标题。 我的问题是:在B类中,当我调用foo()时,我想要与A类完全相同的操作。如何从A中获取相同的代码并且不重复相同的代码? 如果我在B类中省略foo(),它会起作用吗? 或者当我在foo();中调用super.foo()时发生了什么。

4 个答案:

答案 0 :(得分:4)

由于ClassY扩展了ClassX,因此您可以从类B中删除private ClassY b。然后您可以将ClassX的实例设置为a实例变量。这允许在类B中继承foo(),但仍然使用相同的逻辑和实例变量。

public class A {
    protected ClassX a

    public void foo() {
        // operations on a;
    }
}

public class B extends A {
    // do something to set an instance of ClassY to a; for example...
    public void setClassY(ClassY b){
        this.a = b;
    }
}

答案 1 :(得分:1)

听起来像ClassXClassY会有一个共同的界面(如果它们有你想要在earch上调用的相同方法,至少)。您是否考虑过让foo()接受公共接口类型的对象?

public class A {
   private ClassX a;
   protected void foo(ClassXAndClassYInheritMe anObject) {
       operations on anObject;
   }

   public void foo() {
       foo(a);
   }
}

public class B {
   private ClassY b;
   @Override
   public void foo() {
       foo(b);
   }
}

答案 2 :(得分:1)

如果你想要与A中的操作相同的操作,不要在B中定义foo()方法。如果你想要一个不同的操作作为A,覆盖B中的foo()方法。如果你想扩展foo B中的()方法首先在A中然后在B中进行操作,然后在方法的顶部调用super.foo();如果你想让A中的操作在B中的操作之后,那么在方法foo()的末尾调用super.foo()。

答案 3 :(得分:0)

您可以在覆盖的方法中执行super.foo()