【问题标题】:Wish to initialize member before passing to parent constructor希望在传递给父构造函数之前初始化成员
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了。我一直认为构造函数只是调用继承链。
  • @mr_dude 在 C++11 中调用的委托构造函数是新的 - 你没听说过它们并不奇怪。
猜你喜欢
  • 2011-09-13
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多