0

这是我的代码想要使用 AdapterVersion 的对象引用(父类)访问 AdapterVer1 getAdaptObj1() 的子类方法(没有类型转换)

abstract class AdapterVersion {

public abstract void getMObject();
public abstract void getCObject();

}

public class AdapterVer1 extends AdapterVersion {

@Override
public void getMObject() {
    System.out.println("AdapterVer1 Mont");

}

@Override
public void getCObject() {
    System.out.println("AdapterVer1 Conf");

}

public void getAdaptObj1() {

}

}

public class AdapterFactory {

public static void main(String []a){
    AdapterFactory adapterFactory= new AdapterFactory();
    AdapterVersion adpater = adapterFactory.getMyObject("ver1");
    adpater.getAdaptObj1();  // Unable to do that
            ((AdapterVer1)adpater).getAdaptObj1(); // Working but DONT WANT THIS

}

public AdapterVersion getMyObject(String version){
    if(version.equals("ver1")){
        return new AdapterVer1();
    }else{
        return new AdapterVer2(); // another declared class
    }
}

}
4

3 回答 3

4

你不能那样做。因为在编译时,编译器会检查您调用的方法在您正在使用的引用的类中是否可访问或可见。

因此,在这种情况下,由于引用是Parent类的,因此编译器会首先在 Parent 类中查找方法声明,以便成功编译代码。

记住: -

编译器担心Reference类型,在运行时会考虑实际的对象类型,以决定实际调用哪个方法。

您唯一的选择是进行类型转换,在这种情况下,编译器现在会查看您对引用进行类型转换的类。另一种选择是,您可以在 Parent 类中声明一个具有该名称的抽象方法,但是从您的问题来看,您似乎没有明确地这样做。

于 2013-01-14T05:56:48.680 回答
0

您需要将方法声明移至抽象类。

于 2013-01-14T05:59:18.470 回答
0

Rohit 已经很好地解释了它。只需添加我的 2 美分,您应该首先检查子类类型,然后进行类型转换,例如:

if(adapter instanceof Adapterver1) {
    ((AdapterVer1)adpater).getAdaptObj1();
}

这样,如果您的代码尝试处理未声明此类方法的新子类,您的代码将更加安全。

但是您必须要问的问题是,如果您已经知道要调用哪个子类方法,为什么要从超类引用中访问它?

于 2013-01-14T06:09:49.490 回答