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()时发生了什么。
答案 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)
听起来像ClassX
和ClassY
会有一个共同的界面(如果它们有你想要在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()
。