java - 希望在传递给父构造函数之前初始化成员

标签 java oop inheritance constructor

这是我的难题的玩具示例:

public abstract class Car {
    public Car(Seat[] seatsParam) {    // Could be protected.
        driverSeat = new DriverSeat();
        seats = new ArrayList<Seat>();
        seats.add(driverSeat);
        seats.addAll(seatsParam);
    }
    private final List<Seat> seats;
    private final DriverSeat driverSeat;
}

public class MyCar extends Car {
    public MyCar() {
        super(new Seat[]{new PassengerSeat()});    // Cannot assign to member.
    }
    public PassengerSeat getPassengerSeat() {  // Would like this accessor.
        return passengerSeat;
    }
    private final PassengerSeat passengerSeat;
}

Car 有一个 Seat 列表(座位父类(super class)型),最好在构造函数中初始化。每辆车都有一个 DriverSeat。 MyCar 还有一个 PassengerSeat,我想从子类型访问它,但也想从父列表(作为座位)访问它。

我记下的一些东西:

  • 上面的代码:passengerSeat 不会在子类中初始化。我可以在 MyCar 的构造函数中获取列表并沮丧,但这很难看。
  • 将 passengerSeat 设为静态:它不应该是静态的,因为可能有许多其他 MyCars 具有独特的座位。
  • 让 Car 定义一个抽象的 getSubclassSeats() 并向其添加 driverSeat:这在构造函数中不起作用,因为 passengerSeat 尚未初始化。我可以将席位设置为非最终席位并在构造函数之后进行,但同样很丑陋。

我想说这是我应该可以用OO表达的东西,定义一个变量传给parent引用。但是我想不出如何做得很好。自从我使用 C++ 以来已经有一段时间了,但这就是初始化列表解决的问题吗?如果是这样,Java 是否有等效项?

最佳答案

我见过有类似问题的人使用线程局部变量,天知道还有什么其他糟糕的技巧,幸运的是有一个简单的解决方案:

public MyCar() {
    this(new PassengerSeat());   
}

private MyCar(PassengerSeat seat) {
    super(new PassengerSeat[]{seat});   
    // Well do something with your seat now.
}

关于java - 希望在传递给父构造函数之前初始化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27747013/

相关文章:

java - 新套装 : How to implement the sieve of Eratosthenes in java

java - EMF 产生 Swing 应用

java - 观察者模式和有状态的可观察范式

java - 设计模式 - 强制子类的某些行为

c++ - 为什么将一个结构体的引用设置为等于另一个结构体只会改变一个数据成员?

java - DataInputStream 是否会跳过字符?

java - 有没有办法生成源:jar after Proguard obfuscation?

c# - 隐藏在 c# 中的方法以及一个有效的例子。为什么在框架中实现?什么是现实世界的优势?

javascript - 如何向原型(prototype)添加属性 (javascript)

c++ - 防止在头文件之外创建子类