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<People>
、Measurable<? extends Foo>
等
【讨论】:
我是 Java 新手,所以完整的答案会有所帮助。谢谢。【参考方案3】:决定调用哪个的不是参数类型,而是对象类型。因此,这取决于您是创建了 PassangerPlane 还是将 CargoPlane 传递给了调用 addAMeasurableThing 的方法。这是一个更大的设计问题,即如何确保只有正确类型的可测量数据才能进入飞机。例如,如果添加了错误的可测量对象,您可能会抛出异常,然后进一步向上调用堆栈通知用户问题。这取决于什么决定了需要传递给飞机的可测量对象。
您可能还需要 Airplane 上的静态方法(或新类 AirplaneFactory),它根据您传递的示例 Mesurable 为您返回正确的子类。
【讨论】:
这真的很有帮助。谢谢。以上是关于Java继承问题的主要内容,如果未能解决你的问题,请参考以下文章