我有课程Carte
和Croyant
,DeuxEx
是Carte
的子类。在Croyant
和DeuxEx
中,每个类中都存在属性valueCroyant
或valueDeuxEx
。我创建了一个Object
类Carte
的数组。如何从此数组的对象访问方法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循环,但它不起作用。请有人帮帮我!
答案 0 :(得分:0)
c.getValueCroyant()不会编译,因为它的类型是Carte,它是超类。 即使它不优雅,要调用此方法,使用instanceOf也没关系,但你也要投射到Croyant
答案 1 :(得分:0)
您尝试做的事情强烈暗示您的设计存在问题。另一个使用instanceof
进行测试的答案和投射的建议可行,但它非常反OO。基本上,这种解决方案可以绕过多态。
我发现valueCroyant
是int
而valueDeuxEx
是String
。最好的解决方案是重新考虑您的设计,以便这些值是相同类型或实现一些通用接口。然后将值和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。