簡體   English   中英

從超類的對象數組訪問子類的功能

[英]Access to a function of subclass from an array of object of superclass

我有CarteCroyant類, DeuxExCarte子類。 CroyantDeuxEx ,每個類中都存在屬性valueCroyantvalueDeuxEx 我創建了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是一個intvalueDeuxExString 最好的解決方案是重新考慮您的設計,以便這些值是相同的類型或實現某些通用接口。 然后將值和吸氣劑移至通用超類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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM