2014-04-10 17 views
6

Ich habe eine abstrakte Klasse namens Benutzer, ein Benutzer kann entweder als Student-Typ oder als Lehrer-Typ erstellt werden. Ich habe eine Arraylist von Benutzern (von Schülern und Lehrern) gemacht und was ich versuche zu tun ist, ein Verfahren Beispiel nenne je nachdem, was das aktuelle Objekt ist eine Instanz:Mehrere Objekttypen in einer 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(); 
    } 
} 

Das Problem, das ich habe, ist, Da es sich um eine ArrayList von User-Objekten handelt, kann die Student-Methode, beispielsweise getGrade(), nicht abgerufen werden. Da ich jedoch feststellen kann, was der aktuelle Benutzer ist, bin ich neugierig, ob es immer noch möglich ist, eine bestimmte Methode aufzurufen, je nachdem, um welchen Benutzertyp es sich handelt.

Ist das möglich, oder muss ich die Benutzertypen in separate Listen trennen?

Bitte antworten Sie bald, vielen Dank.

Antwort

4

Prüfen der downcast:

In der objektorientierten Programmierung, einziehenden oder Typ Verfeinerung ist der Akt der eine Referenz einer Basisklasse auf einer ihrer abgeleiteten Klassen Gießen.

In vielen Programmiersprachen ist es möglich, durch Art zu überprüfen Innerlichkeit, um zu bestimmen, ob der Typ des referenzierten Objekts ist in der Tat derjenige davon oder eine abgeleitete Typ umgewandelt wird und somit Ausgabe ein Fehler, wenn es ist nicht der Fall.

Mit anderen Worten, wenn eine Variable der Basisklasse (Elternklasse) einen Wert der abgeleiteten Klasse (Kindklasse) hat, ist Downcasting möglich.

Ändern Sie Ihren Code:

if (user instanceof Student) { 

    ((Student) user).getGrade(); 

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

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

Helfen Sie mir meine Antwort zu verbessern und kommentieren Abstimmung? – user987339

+1

Große Antwort. Link, Definition und Beispiel Vielleicht solltest du sonst 'if (userinstanceof Teacher) {}' machen und ein "else" ganz unten für das Standardverhalten setzen. –

+0

Tnx @Nappa The Saiyan! – user987339

5

Sie finden sie in die Klasse werfen müssen, bevor das Verfahren.

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

oder ((Student-) Benutzer) .getGrade(); funktioniert. –

1

Shop Schüler und Lehrer Objekte in userlist und dann in Abhängigkeit von der instanceOf Bedingung nennen sich die jeweiligen Klassenmethode von typecasting

Betrachten Sie unter Beispielcode Benutzertyp

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

hat es dein Problem gelöst? –

+0

Es sollte so aussehen. Zusätzlich sollten die Methoden getSubject und getGrade als getInfo oder ähnliches in die Oberklasse verschoben werden. Das würde die if-Klausel vermeiden und instanceof –

+0

ja, es kann möglich sein ... aber die ** Vererbung ** -Funktionalität besagt, dass die Kind-Klasse Funktionen von Eltern bekommt und zusätzlich ihre eigenen Eigenschaften haben kann. In der obigen Beispielklasse kann Student Methoden wie getBranch(), getLastYearMarks() usw. verwenden, während Teacher getQualification() usw. haben kann.In diesen Fällen würden wir immer noch Bedingungen benötigen, um bestimmte Methoden aufzurufen –

Verwandte Themen