我有这个父类:
abstract class Parent {
abstract int getX();
}
两个不同的子类实现:
class AgnosticChild extends Parent {
private int x = 5;
@Override
int getX() {
return x;
}
}
class ManipulativeChild extends Parent {
private static int x = 5;
ManipulativeChild() {
x++;
}
@Override
int getX() {
return x;
}
}
两个getX()
实现都是相同的。有没有办法摆脱这种冗余,同时保持x
的不同实现?假设getX()
实现在实践中更加精细。
答案 0 :(得分:3)
不,两个实现不相同 - 一个访问静态字段,另一个访问实例字段。因此,尽管它们看起来相同,但它们在功能上却非常不同;并且在没有改变课程行为的情况下,没有机会在这里重复使用。
答案 1 :(得分:2)
您可以将int变量拉到Parent类并在那里实现getX
方法
abstract class Parent {
private int x;
public Parent(int x) {
this.x = x;
}
public int getX() {
return x;
}
}
class AgnosticChild extends Parent {
public AgnosticChild() {
super(5);
}
}
class ManipulativeChild extends Parent {
ManipulativeChild() {
super(6);
}
}
更新:如果您要将x
中的ManipulativeChild
声明为非静态字段,则上方代码段仅等于您的代码。否则这些是两种不同的实现,不能以建议的方式重构。