2014-04-10 5 views
6

मेरे पास उपयोगकर्ता नामक एक सार श्रेणी है, जिसे उपयोगकर्ता को छात्र प्रकार या शिक्षक प्रकार के रूप में बनाया जा सकता है। मैं उन का एक 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(); 
    } 
} 
समस्या मैं आ रही है

क्योंकि यह उपयोगकर्ता ऑब्जेक्ट्स का एक ऐरेलिस्ट है, इसे छात्र प्रकार विधि नहीं मिल सकती है, उदाहरण के लिए, getGrade()। हालांकि, क्योंकि मैं यह निर्धारित करने में सक्षम हूं कि वर्तमान उपयोगकर्ता क्या उदाहरण है, मैं इस बात पर उत्सुक हूं कि यह किस प्रकार के उपयोगकर्ता के आधार पर एक विशिष्ट विधि को कॉल करना संभव है या नहीं।

क्या यह संभव है, या क्या मुझे उपयोगकर्ता प्रकार को अलग सूचियों में अलग करना है?

कृपया उत्तर दें, बहुत धन्यवाद।

उत्तर

4

चेक downcast:

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, downcasting या टाइप शोधन इसके व्युत्पन्न वर्गों में से एक के लिए एक आधार वर्ग के संदर्भ कास्टिंग के कार्य है।

कई प्रोग्रामिंग भाषाओं में, यह प्रकार के माध्यम से जांच करने के लिए आत्मनिरीक्षण निर्धारित करने के लिए संदर्भित वस्तु के प्रकार के वास्तव में एक करने के लिए डाली या इसके एक व्युत्पन्न प्रकार किया जा रहा है संभव है, और इस तरह मुद्दा एक त्रुटि अगर यह ऐसा नहीं है।

दूसरे शब्दों में, जब बेस क्लास (पैरेंट क्लास) के एक चर के पास व्युत्पन्न वर्ग (बाल वर्ग) का मान होता है, तो डाउनकास्टिंग संभव है।

करने के लिए अपने कोड में परिवर्तित करें:

if (user instanceof Student) { 

    ((Student) user).getGrade(); 

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

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

मुझे मेरे जवाब में सुधार करने में मदद करें और वोट कम टिप्पणी? – user987339

+1

ग्रेट उत्तर। लिंक, परिभाषा, और नमूना। यद्यपि शायद आपको और 'अगर (उपयोगकर्ता के उदाहरण के लिए शिक्षक) {}' और डिफ़ॉल्ट व्यवहार के लिए नीचे' else 'डालना चाहिए –

+0

टीएनएक्स @ नप्पा साईं! – user987339

5

आप विधि का उपयोग करने से पहले वर्ग के लिए उन्हें कास्ट करने के लिए की आवश्यकता होगी।

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

या ((छात्र) उपयोगकर्ता) .getGrade(); काम करता है। –

1

उपयोगकर्ता सूची में स्टोर छात्र और शिक्षक वस्तुओं और फिर instanceof स्थिति के आधार पर Typecasting से संबंधित वर्ग के विधि कॉल प्रयोक्ता प्रकार के

नमूना कोड नीचे पर विचार करें

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

क्या आपकी समस्या हल हो गई है? –

+0

यह इस तरह दिखना चाहिए। इसके अतिरिक्त विधियों को प्राप्त करें Subject और getGrade superclass में getInfo या कुछ समान के रूप में स्थानांतरित किया जाना चाहिए। यह अगर-क्लॉज और उदाहरण –

+0

उदाहरण से बच जाएगा, तो यह संभव हो सकता है ... लेकिन ** विरासत ** कार्यक्षमता कहती है कि बाल वर्ग को माता-पिता से सुविधाएं मिलती हैं और इसके अतिरिक्त इसमें इसकी अपनी विशेषताएं भी हो सकती हैं। उपरोक्त उदाहरण वर्ग में छात्र के पास GetBranch(), getLastYearMarks() आदि जैसे विधियां हो सकती हैं जबकि शिक्षक को योग्यता() इत्यादि मिल सकती है।इन मामलों में हमें अभी भी विशिष्ट तरीकों को कॉल करने की शर्तों की आवश्यकता होगी –

संबंधित मुद्दे