2010-04-13 114 views
1

我有一个抽象类飞机,和两个类PassengerAirplane和CargoAirplane,它们扩展了飞机类。 我还有一个可衡量的接口,以及两个实现它的类 - 人员和容器。
所以,飞机可以自己做很多事情,并且有一种方法可以将可度量的东西添加到飞机中(称为addAMeasurableThing)。 PassengerAirplane/CargoAirplane和仅仅是一架飞机之间的唯一区别是,addAeasurableThing应该只接受人/容器,而不是任何可衡量的事情。我如何实现这一点?Java继承问题

我想这样做:
飞机类:

公共抽象飞机 addAMeasurableThing(可测量米,整数 位);

PassengerAirplane类:

公众飞机addAMeasurableThing 的(Measurable男,INT位置){如果(M 的instanceof人)...

CargoAirplane类:

public airplane addAeasurableThing (Meas urable男,INT位置){如果(M 的instanceof容器)...

但是当我调试它,我注意到addAMeasurableThing在CargoAirplane类不会被调用,因为这两种方法具有相同的签名。那么,根据正在传递的可测量事物的类型,如何调用适当的PassengerAirplane/CargoAirplane的addAasurableThing?

谢谢!

+0

也许会发布一些更多的代码,听起来好像还有其他的事情发生。 – 2010-04-13 01:48:13

+0

是的问题不清楚。你是什​​么意思 “我注意到CargoAirplane类中的addAMeasurableThing永远不会被调用,因为两个方法都有相同的签名。”你的测试类实现是什么? – 2010-04-13 01:51:35

+0

你确定你重写了这个方法吗?因为如果你是,你不应该有你描述的问题。 – 2010-04-13 01:54:03

回答

6

使用泛型:

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{ ... } 
} 
+0

这工作如广告!谢谢。 – Misa 2010-04-13 02:23:23

0

尝试寻找到让你衡量的通用类,然后用例如Measurable<People>,Measurable<? extends Foo>

+0

我是Java的新手,所以完整的答案更有帮助。谢谢。 – Misa 2010-04-13 02:26:02

0

它不是确定被调用的参数类型,它是对象类型。所以这取决于你是否创建了一个PassangerPlane或一个CargoPlane传入了调用addAMeasurableThing的方法。这是一个更大的设计问题,如何确保您只有正确类型的测量值才能进入飞机。例如,如果添加了错误的可测量值,则可能会引发异常,然后再调用堆栈来通知用户该问题。这取决于什么是确定需要传递给飞机的可测量物体。

您也可能需要一个静态方法在Airplane(或一个新的AirplaneFactory类)上,根据您传递给它的示例Mesurable,它可以为您提供正确的子类。

+0

这确实有帮助。谢谢。 – Misa 2010-04-13 02:24:22