[英]Access to a function of subclass from an array of object of superclass
我有Carte
和Croyant
類, DeuxEx
是Carte
子類。 在Croyant
和DeuxEx
,每個類中都存在屬性valueCroyant
或valueDeuxEx
。 我創建了Carte
類的Object
數組。 如何從此數組的對象訪問方法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循環,但是不起作用。 有人可以幫我嗎!
c.getValueCroyant()無法編譯,因為它的類型是Carte,這是超類。 即使不是很優雅,也可以使用instanceOf調用此方法,但還必須轉換為Croyant
您嘗試做的事情強烈暗示了您的設計存在問題。 使用instanceof
和casting測試的另一個答案中的建議可能會起作用,但這是非常反OO的。 基本上,這種解決方案繞過了多態性。
我看到valueCroyant
是一個int
而valueDeuxEx
是String
。 最好的解決方案是重新考慮您的設計,以便這些值是相同的類型或實現某些通用接口。 然后將值和吸氣劑移至通用超類Carte
。 如果不可能使用相同的類型表示兩個值,則為Carte
一個抽象方法,該方法將對值進行處理,並在每個子類中以不同的方式實現它。
我認為你應該投。 您顯示的代碼段不會編譯。
像這樣:
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());
}
}
在這里檢查我的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.