我有一个超级'BuildingMaterial'和大量的子类,即Stone,Wood,Clay等。 所有子类的行为都类似:1个int字段,用于存储单位的建筑材料数量。它们可以构造为无参数或带有int。我已经知道BuildingMaterial的所有子类都有这两个构造函数,我如何避免将它们编码到每个类中? 以下是我不想在每个班级做的事情的例子:
public final class Stone extends BuildingMaterial {
private int amount;
//constructors
public Stone() {
amount = 0;
}
public Stone(int i) {
amount = i;
}
//methods
public int getAmount() {
return amount;
}
}
答案 0 :(得分:5)
这里你能做的最好是重构你的代码,以便amount
在超类中:
public abstract class BuildingMaterial {
private int amount;
//constructors
public BuildingMaterial() {
this(0);
}
public BuildingMaterial(int i) {
amount = i;
}
//methods
public int getAmount() {
return amount;
}
}
然后使用super
调用来委托子类中的超类构造函数:
public final class Stone extends BuildingMaterial {
//constructors
public Stone() {
super();
}
public Stone(int i) {
super(i);
}
}
请注意,我将无参数构造函数的主体从amount=0;
更改为this(0);
。我个人认为这是更好的风格,因为如果您决定将其他初始化代码添加到构造函数体中,则只需将其添加到1参数构造函数中,零参数构造函数将只将所有工作委托给它。
答案 1 :(得分:2)
您必须使用inheritance
public abstract class BuildingMaterial {
private int amount;
//constructors
public BuildingMaterial() {
amount = 0;
}
public BuildingMaterial(int i) {
amount = i;
}
//methods
public int getAmount() {
return amount;
}
}
public class Stone extends BuildingMaterial {
public Stone() {
super();
}
public Stone(int i) {
super(i);
}
}
这样BuildingMaterial
的所有子类都可以通过getter和setter访问amount
。
您可能将amount
声明为protected
,因此您不需要getter或setter来访问子类中的该字段。
答案 2 :(得分:1)
使用super
关键字来减少代码,但super
是构造函数中的第一行
public class Stone extends BuildingMaterial {
public Stone() {
super();
}
public Stone(int i) {
super(i);
}
}
答案 3 :(得分:0)
如果所有类都具有属性amount
,则该属性可以从父级继承。在父类amount
中定义BuildingMaterial
,然后使用super
从子类构造函数中调用父构造函数来设置amount
值。
答案 4 :(得分:0)
在你的问题中你不清楚你想要避免什么...假设你在谈论避免在所有子类中编写多个构造函数。我认为不可能这样做。下面定义BuildingMeterial构造函数并从baseClass调用super()将是最好的解决方案。