从超类对象的数组访问子类的函数

时间:2016-11-22 14:50:04

标签: java

我有课程CarteCroyantDeuxExCarte的子类。在CroyantDeuxEx中,每个类中都存在属性valueCroyantvalueDeuxEx。我创建了一个ObjectCarte的数组。如何从此数组的对象访问方法getValueCroyant()getValueDeuxEx()

Class Carte {
    private int id;
    public Carte(int id){
        this.id=id;
    }
}
Class Croyant extends Carte{
    private int valueCroyant;
    public Croyant(int id){
        super(id);
    }
    public int getValueCroyant(){
        return this.valueCroyant;
    }
}
Class DeuxEx extends Carte{
    private String valueDeuxEx;
    public DeuxEx(int id){
      super(id); 
    }
    public String getValueDeuxEx(){
       return this.ValueDeuxEx;
    }
}
public static void main(String[] agrs){
    ArrayList<Carte> array_carte = new ArrayList();
    Croyant cr1 = new Croyant(1);
    Croyant cr2 = new Croyant(2);
    DeuxEx de1= new DeuxEx(3);
    DeuxEx de2 = new DeuxEx(4);
    array_carte.add(cr1);
    array_carte.add(cr2);
    array_carte.add(de1);
    array_carte.add(de2);
    for(Carte c:array_carte){
       if(c instanceof Croyant){
           System.out.println(c.getValueCroyant()); 
        }else{
           System.out.println(c.getValueDeuxEx()); 
        }
    }
}

我想像这样做一个for循环,但它不起作用。请有人帮帮我!

3 个答案:

答案 0 :(得分:0)

c.getValueCroyant()不会编译,因为它的类型是Carte,它是超类。 即使它不优雅,要调用此方法,使用instanceOf也没关系,但你也要投射到Croyant

答案 1 :(得分:0)

您尝试做的事情强烈暗示您的设计存在问题。另一个使用instanceof进行测试的答案和投射的建议可行,但它非常反OO。基本上,这种解决方案可以绕过多态。

我发现valueCroyantintvalueDeuxExString。最好的解决方案是重新考虑您的设计,以便这些值是相同类型或实现一些通用接口。然后将值和getter移动到公共超类Carte。如果不可能使用相同的类型表示两个值,则给Carte一个抽象方法,该方法用于对值执行某些操作,并在每个子类中以不同方式实现它。

答案 2 :(得分:-1)

我认为你应该施展。您显示的代码段不会编译。

这样的事情:

for(Carte c:array_carte){
       if(c instanceof Croyant){
           System.out.println(((Croyant)c).getValueCroyant()); 
        }else if(c instanceof DeuxEx){
           System.out.println(((DeuxEx)c).getValueDeuxEx()); 
        }
    }

检查我的回答here