我有一个超级'车辆'及其子类' Car'如下所示。我想初始化变量' wheel'来自子类Car的构造函数。我无法通过super()调用设置变量,因为它依赖于对方法的调用。
使用超类'是否安全?这里设定方法? 如果不是这些类之间关系的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();
}
}
答案 0 :(得分:1)
如果您可以通过子类构造超类,那么使用它的setter绝对可以。
我猜你的替代方法是将这些调用移到构造函数之外,并在每次实例化新setWheels
时调用Car
?你绝对不想这样做,因为你会重复自己,而你(或其他人)可能会忘记拨打电话。您应该尽可能多地将初始化代码放入构造函数中。这样,如果您需要更改它,您只需要在一个地方更改它。
您甚至可以将超类字段设置为protected:
protected int wheels;
直接更改。但这取决于你自己的判断。
答案 1 :(得分:0)
findNumberOfWheels()
看起来像是一种实用工具方法,因为它不使用Vehicle
和Car
类的任何属性。
如果实际情况属实,那么应该在static
类或其他地方声明Car
。如果它是static
,你可以在调用super()
时内联它的调用,并将它作为参数传递给超类的构造函数,所以我认为不需要调用setter。
通常,如果需要在分配变量之前进行一些计算,通过构造函数初始化属性并委托给实用程序方法会更安全。
如果无法做到这一点,请使用工厂模式或构建器模式。