2014-04-10 20 views
6

Tôi có một lớp trừu tượng được gọi là Người dùng, một người dùng có thể được tạo dưới dạng Loại sinh viên hoặc dưới dạng loại Giáo viên. Tôi đã thực hiện một ArrayList của người sử dụng (của học sinh và giáo viên) và những gì tôi đang cố gắng làm là gọi một ví dụ phương pháp tùy thuộc vào những gì đối tượng hiện nay là một thể hiện của:Nhiều loại đối tượng trong một 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(); 
    } 
} 

Vấn đề tôi đang gặp là vì nó là một ArrayList của các đối tượng User, nó không thể lấy phương thức kiểu Student, ví dụ, getGrade(). Tuy nhiên, bởi vì tôi có thể xác định những gì người dùng hiện tại là một thể hiện của, tôi tò mò như thế nào hay không nó vẫn có thể gọi một phương pháp cụ thể tùy thuộc vào loại người dùng nó được.

Điều này có thể xảy ra không hoặc tôi có phải tách riêng các loại người dùng thành các danh sách riêng biệt không?

Vui lòng trả lời sớm, cảm ơn rất nhiều.

Trả lời

4

Kiểm tra downcast:

Trong lập trình hướng đối tượng, downcasting hoặc gõ tinh là hành đúc một tài liệu tham khảo của một lớp cơ sở để một trong những nguồn gốc lớp của nó.

Trong nhiều ngôn ngữ lập trình, chúng ta có thể kiểm tra thông qua loại mẫn để xác định xem loại đối tượng tham chiếu thực sự là một trong những được đúc hoặc một loại có nguồn gốc của nó, và do đó vấn đề lỗi nếu nó không phải vậy.

Nói cách khác, khi một biến của lớp cơ sở (lớp cha) có giá trị của lớp dẫn xuất (lớp con), có thể downcasting.

Thay đổi mã của bạn để:

if (user instanceof Student) { 

    ((Student) user).getGrade(); 

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

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

giúp tôi để cải thiện câu trả lời của tôi và bình luận bình chọn? – user987339

+1

Câu trả lời hay. Liên kết, định nghĩa và mẫu. Mặc dù có lẽ bạn nên làm khác 'if (user instanceof Teacher) {}' và đặt một 'else' ở phía dưới chỉ cho hành vi mặc định –

+0

Tnx @Nappa The Saiyan! – user987339

5

Bạn sẽ cần phải quăng vào lớp trước khi sử dụng phương pháp này.

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

hoặc ((Sinh viên) người dùng) .getGrade(); công trinh. –

1

sinh viên Store và giáo viên các đối tượng trong danh sách người dùng và sau đó tùy thuộc vào tình trạng instanceof gọi phương thức lớp tương ứng bởi typecasting để loại người dùng

xem xét dưới đây mẫu mã

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

nó đã giải quyết được vấn đề của bạn chưa? –

+0

Nó sẽ giống như thế này. Ngoài ra, các phương thức getSubject và getGrade sẽ được chuyển đến lớp cha như getInfo hoặc một cái gì đó tương tự. Điều đó sẽ tránh mệnh đề if và instanceof –

+0

có thể thực hiện được ... nhưng chức năng ** kế thừa ** nói rằng lớp con nhận các tính năng từ cha mẹ và bổ sung nó có thể có các tính năng riêng của nó. Trong lớp Ví dụ trên, Học sinh có thể có các phương thức như getBranch(), getLastYearMarks() vv trong khi Giáo viên có thể có getQualification() vv.trong những trường hợp này, chúng ta vẫn cần điều kiện để gọi các phương thức cụ thể –

Các vấn đề liên quan