铸造问题(可能的解决方法)

时间:2011-10-23 12:50:04

标签: java inheritance casting

好吧所以我已经从大学设定了一份任务,我无法理解这个问题,我是班上唯一一个有这么远的人,我的讲师没有回到我。

基本上是继承和多态,我们使用父类,然后从父级创建子项;

private HashMap<String,Aircraft> allAircraft = new HashMap<String,Aircraft>();
Aircraft plane = new Plane(reg,pass,cargo);

所以父母不能使用儿童方法,我理解这背后的大部分概念,并设法让我解决它。对于其中一种方法,我们特别要求使用铸造(即使我被告知无数次,如果我必须使用它然后我应该重组)但是对于另一种方法,我们被要求调用一个方法只是具体的两个子类,在这里转换不起作用,因为我不知道HashMap中的子类是什么。

所以我的问题是;在使用多态时,我如何在父类上使用两个子类方法?

我的思绪非常爆炸。

3 个答案:

答案 0 :(得分:3)

如果你需要向下转换,那么你就不再使用多态。如果那是老师想要的,那么你可以通过测试对象的实际类型是否合适,以安全的方式向下转换:

if (plane instanceof SubClass1) {
    SubClass1 s = (SubClass1) plane;
    s.someSpecificMethod();
}
if (plane instanceof SubClass2) {
    SubClass2 s = (SubClass2) plane;
    s.someSpecificMethod();
}

如果此方法对两个子类都是通用的,则可能意味着它们实际上共享相同的接口。所以多态性可以在这里重新发挥作用:

public interface PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters();
}

public class SubClass1 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

public class SubClass2 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

if (plane instanceof PassengerTransporter) {
    PassengerTransporter p = (PassengerTransporter) plane;
    p.someSpecificMethodToAllPassengerTransporters();
}

答案 1 :(得分:0)

如果此时无法更改基本/派生层次结构,请查看instanceof运算符。

答案 2 :(得分:0)

您可以使用getClass()方法找出对象的确切类,或者您也可以使用instanceof运算符询问某个对象是否属于某种类型。无论哪种方式,不得不向对象询问其特定类别,但在某些情况下,您没有选择。