2014-04-10 16 views
6

Ho una classe astratta denominata Utente, un utente può essere creato sia come tipo Studente che come tipo Insegnante. Ho fatto un ArrayList di utenti (di studenti e docenti) e quello che sto cercando di fare è chiamare un metodo di esempio a seconda di ciò l'oggetto corrente è un'istanza di:Tipi di oggetti multipli in un ArrayList

for (User user : listOfUsers) { 

    String name = user.getName(); 

    if (user instanceof Student) { 

    // call getGrade(); 

    } else { // it is an instance of a Teacher 

    // call getSubject(); 
    } 
} 

Il problema che sto avendo è poiché è un oggetto ArrayList di oggetti User, non può ottenere il metodo del tipo Studente, ad esempio getGrade(). Tuttavia, poiché sono in grado di determinare l'istanza di un utente corrente, sono curioso di sapere se sia ancora possibile chiamare un metodo specifico a seconda del tipo di utente.

È possibile o devo separare i tipi di utenti in elenchi separati?

Si prega di rispondere presto, molte grazie.

risposta

4

Controllare il downcast:

Nella programmazione orientata agli oggetti, downcasting o digitare perfezionamento è il atto di lanciare un riferimento di una classe base ad uno dei suoi derivati ​​ classi.

In molti linguaggi di programmazione, è possibile verificare attraverso tipo introspezione per determinare se il tipo dell'oggetto riferimento è infatti quello di essere lanciato o un tipo derivato di esso, e quindi problema un errore se non è il caso.

In altre parole, quando una variabile della classe base (classe genitore) ha un valore della classe derivata (classe figlio), è possibile il downcasting.

modificare il codice per:

if (user instanceof Student) { 

    ((Student) user).getGrade(); 

    } else { // it is an instance of a Teacher 

    ((Teacher) user).getSubject(); 
    } 
+0

mi aiutano a migliorare la mia risposta e commentare il voto? – user987339

+1

Ottima risposta. Link, definizione e campione. Anche se forse dovresti fare qualcos'altro 'if (user instanceof Teacher) {}' e mettere un 'else' in basso solo per comportamento predefinito –

+0

Tnx @Nappa The Saiyan! – user987339

5

Avrai bisogno di gettarli alla classe prima di utilizzare il metodo.

for (User user : listOfUsers) { 

    String name = user.getName(); 

    if (user instanceof Student) { 

     Student tmp = (Student)user; 

     // call getGrade(); 
     tmp.getGrade(); 

    } else { // it is an instance of a Teacher 
     Teacher tmp = (Teacher)user; 
     // call getSubject(); 
     tmp.getSubject(); 
    } 
} 
+0

o (utente (studente)) .getGrade(); lavori. –

1

studenti Store e dell'insegnante oggetti in userList e poi a seconda della condizione instanceof chiamano il relativo metodo di classe da fusione di caratteri per UserType

consideri sotto il codice di esempio

abstract class User{ 

     public abstract String getName(); 
    } 

    class Student extends User{ 

     @Override 
     public String getName() { 
      // TODO Auto-generated method stub 
      return "Student"; 
     } 

     public String getGrade(){ 
      return "First Class"; 
     } 

    } 


    class Teacher extends User{ 

     @Override 
     public String getName() { 
      // TODO Auto-generated method stub 
      return "Teacher"; 
     } 

     public String getSubject(){ 
      return "Java"; 
     } 

    } 

public class Util { 

public static void main(String[] args) { 


     Student s = new Student(); 
     Teacher t = new Teacher(); 

     ArrayList<User> list = new ArrayList<User>(); 
     list.add(s); 
     list.add(t); 

     for(User user :list){ 
      if(user instanceof Student){ 
       System.out.println(((Student) user).getGrade()); 
      } 

      if(user instanceof Teacher){ 
       System.out.println(((Teacher) user).getSubject()); 
      } 
     } 
} 
} 
+0

ha risolto il tuo problema? –

+0

Dovrebbe assomigliare a questo. Inoltre i metodi getSubject e getGrade devono essere spostati nella superclasse come getInfo o qualcosa di simile. Ciò eviterebbe la clausola if e l'istanza di –

+0

sì, può essere possibile ... ma la funzionalità di ereditarietà ** dice che la classe figlio ottiene le caratteristiche dal genitore e inoltre può avere le sue caratteristiche. Nella classe di esempio Sopra lo studente può avere metodi come getBranch(), getLastYearMarks() ecc. Mentre Teacher può avere getQualification() ecc.in questi casi avremmo ancora bisogno delle condizioni per chiamare metodi specifici –

Problemi correlati