【问题标题】:Java inheritance questionJava继承问题
【发布时间】:2010-04-13 01:44:40
【问题描述】:

我有一个抽象类Airplane,以及两个类PassengerAirplane 和CargoAirplane,它们扩展了Airplane 类。 我还有一个接口 Measurable,以及两个实现它的类 - People 和 Containers。
所以,飞机可以自己做很多事情,并且有一种方法可以将可测量的东西添加到飞机上(称为 addAMeasurableThing)。 PassengerAirplane/CargoAirplane 和只是一个 Airplane 的唯一区别是 addAMeasurableThing 应该只接受 People / Containers,而不是任何类型的 Measurable 事物。我该如何实现?

我尝试过:
飞机等级:

公共抽象飞机 addAMeasurableThing(可测量的 m,int 位置);

PassengerAirplane 类:

公共飞机 addAMeasurableThing (可测量的 m,int 位置){ if (m 人的实例)...

CargoAirplane 类:

公共飞机 addAMeasurableThing (可测量的 m,int 位置){ if (m 容器实例)...

但是当我调试它时,我注意到 CargoAirplane 类中的 addAMeasurableThing 永远不会被调用,因为这两个方法具有相同的签名。那么如何调用适当的PassengerAirplane/CargoAirplane 的addAMeasurableThing,这取决于传递的Measurable 事物的类型?

谢谢!

【问题讨论】:

  • 也许再贴一些你的代码,听起来可能还有其他事情发生。
  • 是的,问题不清楚。你是什​​么意思“我注意到 CargoAirplane 类中的 addAMeasurableThing 永远不会被调用,因为这两个方法具有相同的签名。”你的测试类实现是什么?
  • 您确定要覆盖该方法吗?因为如果你是,你不应该有你描述的问题。

标签: java inheritance interface abstract-class


【解决方案1】:

使用泛型:

abstract class Airplane<M extends Measurable>{
    public abstract Airplane addAMeasurableThing(M m, int position);
}

class PassengerAirplane extends Airplane<People>{
    @Override
    public Airplane addAMeasurableThing(People p, int position{ ... }
}

【讨论】:

    【解决方案2】:

    尝试使您的 Measurable 类具有通用性,然后使用例如Measurable&lt;People&gt;Measurable&lt;? extends Foo&gt;

    【讨论】:

    • 我是 Java 新手,所以完整的答案会有所帮助。谢谢。
    【解决方案3】:

    决定调用哪个的不是参数类型,而是对象类型。因此,这取决于您是创建了 PassangerPlane 还是将 CargoPlane 传递给了调用 addAMeasurableThing 的方法。这是一个更大的设计问题,即如何确保只有正确类型的可测量数据才能进入飞机。例如,如果添加了错误的可测量对象,您可能会抛出异常,然后进一步向上调用堆栈通知用户问题。这取决于什么决定了需要传递给飞机的可测量对象。

    您可能还需要 Airplane 上的静态方法(或新类 AirplaneFactory),它根据您传递的示例 Mesurable 为您返回正确的子类。

    【讨论】:

    • 这真的很有帮助。谢谢。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2011-08-04
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多