Java类A继承自类B,并且重写了方法。

3
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类完全相同的操作。我该如何实现这一点而不重复A类中的代码? 如果我在B类中省略foo()方法,是否可以实现相同效果? 或者当我在foo()中调用super.foo()时会发生什么?


你的意思是我的类层次结构定义不清楚吗?Alex,我删除了我的答案。我没有仔细阅读问题,请忽略。 - jamesmortensen
4个回答

4

由于ClassY扩展自ClassX,因此您可以从类B中删除private ClassY b。然后,您可以将ClassX的实例设置为a实例变量。这使得class 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;
    }
}

这不会对 b 产生任何影响。 - Mike Samuel
1
@nicholas.hauschild,原帖中说了它是这样的。 - Jeremy
@JeremyHeiler:这样写会不会是 super.a = this.b? - xiaofan2406
@Alex,不行。因为B扩展了A,所以B的任何实例都可以将自己的a称为this.a。此外,通过说this.b,你在暗示存在一个b实例变量,而在我的示例中并没有这样的变量。 - Jeremy

1

听起来像是ClassXClassY会有一个共同的接口(如果它们有你想要调用的相同方法的话)。你考虑过让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);
   }
}

我认为ClassXAndClassYInheritMe可以简化为ClassX,因为ClassY扩展了ClassX。 - hoge1e3
@hoge1e3 你说得对。这是我在原问题中没有看到的东西。无论如何,这仍然是一个有效的解决方案。 - nicholas.hauschild

1
如果您想要在B中执行与A相同的操作,请不要定义foo()方法。如果您想要执行与A不同的操作,请覆盖B中的foo()方法。如果您想要扩展B中的foo()方法,使其首先执行A中的操作,然后再执行B中的操作,则请在方法顶部调用super.foo();如果您希望在B中的操作之后执行A中的操作,则请在方法foo()的末尾调用super.foo()。

0

在你重写的方法中,可以使用super.foo()


这会对a进行操作吗? - xiaofan2406
当你调用super时,它首先运行你的超类方法,即在这种情况下是A类的方法foo。 - Tolio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接