我应该使用超类' setters从子类初始化其实例变量?

时间:2015-03-02 02:04:48

标签: java inheritance

我有一个超级'车辆'及其子类' 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();
    }

}

2 个答案:

答案 0 :(得分:1)

如果您可以通过子类构造超类,那么使用它的setter绝对可以。

我猜你的替代方法是将这些调用移到构造函数之外,并在每次实例化新setWheels时调用Car?你绝对不想这样做,因为你会重复自己,而你(或其他人)可能会忘记拨打电话。您应该尽可能多地将初始化代码放入构造函数中。这样,如果您需要更改它,您只需要在一个地方更改它。

您甚至可以将超类字段设置为protected:

protected int wheels;

直接更改。但这取决于你自己的判断。

答案 1 :(得分:0)

findNumberOfWheels()看起来像是一种实用工具方法,因为它不使用VehicleCar类的任何属性。

如果实际情况属实,那么应该在static类或其他地方声明Car。如果它是static,你可以在调用super()时内联它的调用,并将它作为参数传递给超类的构造函数,所以我认为不需要调用setter。

通常,如果需要在分配变量之前进行一些计算,通过构造函数初始化属性并委托给实用程序方法会更安全。

如果无法做到这一点,请使用工厂模式或构建器模式。