2014-04-10 40 views
6

Mam klasę abstrakcyjną o nazwie Użytkownik, użytkownik może być utworzony jako typ Ucznia lub jako Nauczyciel. Zrobiłem ArrayList użytkowników (uczniów i nauczycieli) i co próbuję zrobić, to wezwać przykładowy sposób w zależności od tego, co obecny obiekt jest instancją:Wiele typów obiektów w jednej 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(); 
    } 
} 

Problem mam jest ponieważ jest to ArrayList obiektów User, nie może uzyskać metody typu Student, na przykład getGrade(). Ponieważ jednak jestem w stanie określić, na czym polega bieżący użytkownik, jestem ciekawy, czy nadal możliwe jest wywołanie konkretnej metody w zależności od typu użytkownika.

Czy to możliwe, czy muszę rozdzielić typy użytkowników na osobne listy?

Prosimy o odpowiedź wkrótce, wielkie dzięki.

Odpowiedz

4

Sprawdź downcast:

W programowaniu obiektowym, rzutowanie w dół lub wpisz dystynkcja jest akt rzucania odniesienie klasy podstawowej do jednej z jej pochodnych klas.

W wielu językach programowania, możliwe jest, aby sprawdzić poprzez typu introspekcję w celu ustalenia, czy rodzaj odwołania obiektu jest rzeczywiście jeden odlewanego lub typ pochodzący od niego, a tym samym problem błędu, jeśli tak nie jest.

Innymi słowy, gdy zmienna klasy podstawowej (klasa macierzysta) ma wartość wartości klasy pochodnej (klasa potomna), możliwe jest downcasting.

Zmień swój kod do:

if (user instanceof Student) { 

    ((Student) user).getGrade(); 

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

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

Pomóż mi poprawić moją odpowiedź i skomentować głosowanie? – user987339

+1

Świetna odpowiedź. Link, definicja i próbka. Choć może powinieneś zrobić jeszcze 'if (user instanceof Teacher) {}' i umieścić 'else' na dole tylko dla domyślnego zachowania –

+0

Tnx @Nappa The Saiyan! – user987339

5

Musisz oddać je do klasy przed zastosowaniem metody.

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

lub (użytkownik (Student)) .getGrade(); Prace. –

1

studenckie Przechowywać i nauczyciel przedmiotów w UserList a następnie w zależności od stanu instanceof wywołać odpowiednią metodę klasy przez rzutowania do UserType

Rozważyć poniżej przykładowy kod

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

czy to rozwiązało Twój problem? –

+0

To powinno wyglądać tak. Dodatkowo metody getSubject i getGrade powinny zostać przeniesione do nadklasy jako getInfo lub coś podobnego. Uniknęłoby to klauzuli if i instancji –

+0

tak, może to być możliwe ... ale funkcjonalność ** dziedziczenia ** mówi, że klasa potomna pobiera funkcje od rodzica i dodatkowo może mieć własne funkcje. W powyższej przykładowej klasie Student może mieć metody takie jak getBranch(), getLastYearMarks() itp., Podczas gdy Teacher może mieć getQualification() itd.w takich przypadkach nadal potrzebowalibyśmy warunków, aby wywoływać określone metody –