我正在尝试使用父类在多个继承类中重用,但父类需要有一个实例变量才能工作。
public class Num {
private int a = 1;
public int calc() {
int c = a + 4;
return c;
}
}
public class Two extends Num {
private int a = 2;
}
每个子类之间的主要区别是它们的实例变量的值。有没有办法让两个人仍然可以利用泛型类Num中的calc()代码,而不是简单地通过将“a”参数设置为它自己的值来覆盖它,或者我是以完全错误的方式解决这个问题?
答案 0 :(得分:1)
只是一个技巧,将a作为输入参数传递给方法应该可以帮助你:
public int calc(int a) {
int c = a + 4;
return c;
}
我认为即使你不这样做,那么使用this
应该使用调用对象的a值:
public int calc() {
int c = this.a + 4;
return c;
}
答案 1 :(得分:1)
在构造函数中初始化“a”并使其受保护:
public class Num {
protected int a;
public Num() { a = 1; }
public int calc() {
int c = a + 4;
return c;
}
}
public class Two extends Num {
public Two() { a = 2; }
}
答案 2 :(得分:0)
为a
添加受保护的getter,然后它将类似于模板方法:
public class Num {
public int calc() {
int c = getA()+ 4;
return c;
}
protected int getA() {
return 1;
}
}
static class Two extends Num {
@Override
protected int getA() {
return 2;
}
}
答案 3 :(得分:0)
使a
受保护并不是最常用的封装方式。如果将a
的初始化放在Num
的构造函数中,那么Two
也可以调用该构造函数。重用它的逻辑。
public class Num {
private final int a;
public Num(int a) {
this.a = a;
}
public int calc() {
return a + 4;
}
}
public class Two extends Num {
public Two(int a) {
super(a);
}
}