2016-11-22 2 views
0

У меня есть классы 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()); 
      } 
     } 
    } 

Я хочу сделать такой кусок, но это не сработает. Может кто-нибудь мне помочь!

+0

Этот код даже не компилируется. Кроме того, «boucle» вы, вероятно, имеете в виду «петлю». Google и google translate - ваши друзья здесь. – Mena

+0

Какой класс является вашей 'main()' частью здесь, или вы просто пытаетесь выполнить этот код? – nullpointer

ответ

0

c.getValueCroyant() не будет скомпилирован, так как его тип - это Carte, который является суперклассом. Даже если это не изящно, для вызова этого метода, используя 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

, пожалуйста, уточните ответ в соответствии с вопросом OPs или отметьте дубликат, если это похоже на некоторую другую ссылку. – nullpointer

+0

@nullpointer Спасибо. Я отредактировал, чтобы показать тип каста, о котором я говорил. –

+0

(Croyant) c работает хорошо. Это то, что я нахожу. Большое вам спасибо ^^ –

0

Что вы пытаетесь сделать, намекает на проблему с вашим дизайном. Предложение в другом ответе на тестирование с instanceof и литье будет работать, но это очень анти-OO. В принципе, такое решение обходит полиморфизм.

Я вижу, что valueCroyant является int, а valueDeuxEx - String. Лучшим решением было бы переосмыслить ваш дизайн, чтобы эти значения были одного типа или реализовали некоторый общий интерфейс. Затем переместите значение и геттер в общий суперкласс Carte. Если невозможно представить оба значения с использованием одного и того же типа, тогда дайте Carte абстрактный метод, который предназначен для выполнения чего-то со значением и реализует его по-разному в каждом подклассе.

Смежные вопросы