2016-11-22 23 views
0

クラスCarteCroyant,DeuxExCarteのサブクラスです。 CroyantDeuxExには、各クラスに存在する属性valueCroyantまたはvalueDeuxExがあります。私はクラスCarteObjectの配列を作成します。この配列のオブジェクトからメソッド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()); 
      } 
     } 
    } 

私はこのようなブールをしたいですが、動作しません。誰かが私を助けてくれますか?

+0

そのコードはコンパイルされません。また、 "boucle"ではおそらく "ループ"を意味します。 GoogleとGoogle翻訳はあなたの友人です。 – Mena

+0

あなたの 'main()'クラスはこのクラスの一部ですか、単にこのコードを実行しようとしていますか? – nullpointer

答えて

0

c.getValueCroyant()は、その型がスーパークラスであるため、コンパイルされません。 エレガントでない場合でも、このメソッドを呼び出すにはinstanceOfを使用しても問題ありませんが、Croyantにキャストする必要があります。

-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を確認してください。

+0

OPの質問にしたがって答えを詳述するか、他のリンクと似ていると重複してください。 – nullpointer

+0

@nullpointerありがとう。私が指摘していたタイプのキャスティングを表示するように編集しました。 –

+0

(Croyant)cはうまく動作します。どうもありがとうございます^^ –

0

デザインの問題で強くヒントをしようとしているもの。 instanceofのテストとキャスティングの別の回答での提案はうまくいくが、それは非常に反抗的だ。基本的には、その種の解決策は多型を回避します。

valueCroyantintであり、valueDeuxExStringであることがわかります。最良の解決策は、これらの値が同じタイプであるか、または共通のインターフェースを実装するように設計を再考することです。その後、値とゲッターを共通のスーパークラスCarteに移動します。同じ型を使用して両方の値を表すことが不可能な場合は、Carteに値を使って何かを行う抽象メソッドを与え、それを各サブクラスで別々に実装します。

関連する問題