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

时间:2015-01-02 18:47:28

标签: 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(座位超类型)列表,最好在构造函数中初始化。每辆车都有一个DriverSeat。 MyCar还有一个PassengerSeat,我想从子类型访问,也可以从父列表(作为席位)访问。

我击落的一些事情:

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

我想说这是我应该能够在OO中表达的内容,定义一个变量并将其传递给父引用。但我想不出怎么做得很好。自从我使用C ++以来已经有一段时间了,但这是初始化列表解决的问题吗?如果是这样,Java是否具有等价物?

1 个答案:

答案 0 :(得分:2)

我见过有类似问题的人使用线程局部变量,上帝知道其他可怕的技巧,幸运的是有一个简单的解决方案:

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

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