Java继承问题

Posted

技术标签:

【中文标题】Java继承问题【英文标题】:Java inheritance question 【发布时间】: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 永远不会被调用,因为这两个方法具有相同的签名。”你的测试类实现是什么? 您确定要覆盖该方法吗?因为如果你是,你不应该有你描述的问题。 【参考方案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 为您返回正确的子类。

【讨论】:

这真的很有帮助。谢谢。

以上是关于Java继承问题的主要内容,如果未能解决你的问题,请参考以下文章

java中的多重继承是啥意思?

java 继承父类 是会先执行父类吗

java继承

Java提高篇——Java实现多重继承

Java_继承

java继承中同名函数的问题