【发布时间】:2015-03-02 23:57:03
【问题描述】:
我有一个超类“Vehicle”及其子类“Car”,如下所示。我想从子类 Car 的构造函数中初始化变量“wheels”。我无法通过 super() 调用设置变量,因为它依赖于对方法的调用。
在这里使用超类的 setter 方法是否安全? 如果不是,类之间关系的OO基础有问题吗?
ps。尝试原谅笨拙的车辆/汽车/底盘示例,并假设在构造函数之外调用“findNumberOfWheels”方法是必要的。
车辆类别
public abstract class Vehicle {
private int wheels;
private Chassis chassis;
public Vehicle(Chassis chassis){
this.chassis = chassis;
}
public int getWheels() {
return wheels;
}
public void setWheels(int wheels) {
this.wheels = wheels;
}
public Chassis getChassis() {
return chassis;
}
public void setChassis(Chassis chassis) {
this.chassis = chassis;
}
}
汽车类
public class Car extends Vehicle{
public Car(Chassis chassis) {
super(chassis);
setWheels(findNumberofWheels(chassis));
}
private int findNumberofWheels(Chassis chassis){
return chassis.getWheels();
}
}
【问题讨论】:
-
没关系,你不需要重写子类的getter/setter,它的行为方式是一样的。
-
如果有人打电话给
Car.setWheels(70)怎么办?如果可能,您应该避免向基本类型的接口添加突变器。通过构造函数注入轮子的数量,使属性final会更安全。 -
查看 Jon Skeet 对此主题的看法:stackoverflow.com/a/4893604/1980909
-
findNumberOfWheels()对我来说似乎是一种实用方法,因为它既不使用Vehicle也不使用Car的任何属性。如果在现实中是这样,那么它应该被声明为静态的,要么在Car类中,要么在其他地方。如果它是静态的,您可以在对super()的调用中内联它的调用,并将其作为参数传递给超类的构造函数,所以我认为不需要调用 setter。 -
这段代码似乎有问题——底盘定义了轮子的数量
chassis.getWheels();,所以这是一个委托案例。没有必要在 Car 和 Vehicle 中维护重复属性
标签: java inheritance