java - 我应该使用父类(super class)的 setter 从子类初始化其实例变量吗?

标签 java inheritance

我有一个父类(super class)“车辆”及其子类“汽车”,如下所示。我想从子类 Car 的构造函数中初始化变量“wheels”。我无法通过 super() 调用设置变量,因为它依赖于对方法的调用。

在这里使用父类(super class)的 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();
    }

}

最佳答案

如果您可以通过子类构造父类(super class),那么您绝对应该可以使用其 setter 。

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

您甚至可以将父类(super class)字段设置为 protected :

protected int wheels;

直接修改即可。但这取决于您自己的判断。

关于java - 我应该使用父类(super class)的 setter 从子类初始化其实例变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28801653/

相关文章:

java - 改进嵌套枚举定义

java - SOLR入门,帮助不大

java - 解析模板时出错 [/],模板可能不存在,或者任何已配置的模板解析器都无法访问该模板

c++ - 访问隐藏的继承成员

javascript - 在 javascript 中增强继承的函数

java - 是否可以对二维数组的第一列进行排序,但在java中保持相应的值相同

java - 在一种情况下返回 @ResponseBody,在另一种情况下返回 ModelAndView

javascript - 处理嵌套 React 组件的状态变化

java - 为什么不能从子类访问 protected 方法?

c# - 强制基方法调用