【问题标题】:java class A extends class B, and method overridejava类A扩展类B,方法覆盖
【发布时间】:2012-05-18 03:06:14
【问题描述】:
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() 时发生了什么;

【问题讨论】:

  • Do you mean that my class hierarchy is not well defined? Alex,我删除了我的答案。我没有清楚地阅读这个问题。请无视。

标签: java class overriding extends


【解决方案1】:

由于 ClassY 扩展了 ClassX,因此您可以从 B 类中删除 private ClassY 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;
    }
}

【讨论】:

  • 这不会对b产生任何影响。
  • @nicholas.hauschild,OP 说是。
  • @JeremyHeiler:会是 super.a = this.b 吗?
  • @Alex,不。既然 B 扩展了 A,那么 B 的任何实例都可以将自己的 a 引用为 this.a。另外,说this.b 是在暗示有一个b 实例变量,在我的示例中没有。
【解决方案2】:

听起来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);
   }
}

【讨论】:

  • 我认为 ClassXAndClassYInheritMe 可以只是 ClassX,因为 ClassY 扩展了 ClassX
  • @hoge1e3 你是对的。这是我在原始问题中没有看到的。无论哪种方式,这仍然是一个有效的解决方案。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这会对a进行操作吗?
    • 当然,当你调用super时,它首先运行你的超类的方法,在这个例子中是class A方法foo。