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() 时发生了什么;

4

4 回答 4

4

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

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;
    }
}
于 2012-05-18T03:08:32.480 回答
1

这听起来像ClassX并且ClassY会有一个通用接口(如果它们有相同的方法你想在 ear 上调用,至少)。您是否考虑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);
   }
}
于 2012-05-18T03:12:53.670 回答
1

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

于 2012-05-18T03:20:47.847 回答
0

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

于 2012-05-18T03:13:08.640 回答