【发布时间】:2015-03-01 01:42:54
【问题描述】:
这是我的难题的玩具示例:
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 的构造函数中获取列表并向下转换,但这很难看。
- 让passengerSeat 静态:它不应该是静态的,因为可能有许多其他MyCars 具有独特的座位。
- 让 Car 定义一个抽象的 getSubclassSeats(),它会向其中添加 driverSeat:这在构造函数中不起作用,因为尚未初始化乘客座椅。我可以将席位设置为非最终席位,并在构造函数之后执行,但又是丑陋的。
我想说这是我应该能够在OO中表达的东西,定义一个变量并将其传递给父级以进行引用。但我想不出如何做得很好。自从我使用 C++ 以来已经有一段时间了,但这就是初始化列表解决的问题吗?如果有,Java 有没有等价物?
【问题讨论】:
-
我想另一种策略是让 Car 中对座位进行操作的所有内容分别执行 driverSeat 和 getChildSeats() 。同样,有效但不优雅。
-
尝试传入
new Seat[] { new PassengerSeat() }。您没有正确传递数组 -
哦,谢谢,我已经更新了。但我的问题不是编译,而是“new PassengerSeat()”被子类型丢失的事实。
标签: java oop inheritance constructor