2013-01-14 41 views
0

这里是我的代码要使用AdapterVersion(父类)的对象引用如何使用父对象引用

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 
    } 
} 

} 
访问AdapterVer1 getAdaptObj1()的子类中的方法(不压铸类)来调用子类的非超越控制方法

回答

4

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

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

记住: -

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

您拥有的唯一选项是typecast,在这种情况下,编译器现在查看您在其中指定参考的类。其他选项是,你可以在Parent类中声明一个带有这个名字的抽象方法,但是从你的问题来看,你似乎明确地没有这样做。

0

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

0

Rohit已经很好地解释了它。我想补充我的2美分,你应该首先检查子类型,然后强制转换,例如:

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

这样,如果它试图处理一个新的子类不声明这样的方法,你的代码将更加安全。

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