Java 希望在传递给父构造函数之前初始化成员
下面是我的难题的一个玩具示例:Java 希望在传递给父构造函数之前初始化成员,java,oop,inheritance,constructor,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(seatsPar
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;
}
公共抽象类汽车{
公共汽车(座位[]座参数){//可以得到保护。
driverSeat=新的driverSeat();
seats=newarraylist();
座位。添加(驾驶员座位);
seats.addAll(seatsParam);
}
非公开最终名单席位;
私人最终驾驶员在驾驶员处;
}
公共级MyCar扩展了Car{
公共小汽车(){
超级(新席位[]{new PassengerSeat()});//无法分配给成员。
}
公共PassengerSeat getPassengerSeat(){//希望使用此访问器。
回程旅客电话;
}
私人最后乘客在PassengerSeat;
}
Car有一个座椅列表(座椅超类型),理想情况下在构造函数中初始化。每辆车都有一个司机室。MyCar还有一个PassengerSeat,我想从子类型访问它,但也可以从父列表(作为座位)访问它
我击落的一些东西:
- 上面的代码:passengerSeat不会在子类中初始化。我可以在我的车的构造函数和downcast中得到这个列表,但这很难看
- 让乘客保持静止:它不应该是静止的,因为可能会有许多其他MyCars具有独特的座椅
- 让Car定义一个抽象的getSubclassSeats(),并向其添加driverSeat:这在构造函数中不起作用,因为PassengereAT尚未初始化。我可以让座位成为非最终的,然后在构造器之后再做,但是,再一次,丑陋
我想说的是,这是我应该能够在OO中表达的东西,定义一个变量并将其传递给父对象以供引用。但我想不出如何做得好。我用C++工作了一段时间,但是初始化列表是这样解决的吗?如果是这样的话,Java是否有一个等价物?我见过有类似问题的人使用线程局部变量,天知道还有什么可怕的技巧,幸运的是有一个简单的解决方案:
public MyCar() {
this(new PassengerSeat());
}
private MyCar(PassengerSeat seat) {
super(new PassengerSeat[]{seat});
// Well do something with your seat now.
}
我想另一个策略是让车内所有在座椅上运行的东西都单独运行driverSeat,然后获取childseats()。同样,它可以工作,但并不优雅。Tryy通过
new Seat[]{new PassengerSeat()}
。你没有通过arrayOh谢谢,我已经更新了。但我的问题不是编译,而是“new PassengerSeat()”在subtype.Awesome中丢失的事实。我一直认为构造函数只是调用继承链。@mr_dude在调用构造函数时委托它们是C++11的新特性-你没听说过它们也就不足为奇了。