2012-04-26 8 views
5

मैं विरासत का उपयोग करने की कोशिश कर रहा हूं ताकि मैं टेस्ट क्लास में सही कोड को सही तरीके से कर सकूं। मुझे यकीन नहीं है कि बाथपी नामक एक अमूर्त वर्ग या इंटरफ़ेस को कैसे कार्यान्वित किया जाए जिसमें goPee() विधि शामिल है। क्या आप जानते हैं कि इसे कैसे कोड करें?विरासत का उपयोग, क्यों जाना जाता है() मेरी टेस्ट क्लास में परिभाषित नहीं है?

यदि मैं या तो एक अमूर्त वर्ग या इंटरफ़ेस जोड़ता हूं और उन्हें क्रमशः विस्तार या कार्यान्वयन के माध्यम से मानव वर्ग में जोड़ता हूं, तो मुझे हमेशा goPee() विधि के लिए मानव वर्ग में कार्यान्वयन लिखने के लिए कहा जाता है, जिसे मैं नहीं चाहता करने के लिए, क्योंकि मेरे goPee() विधि कार्यान्वयन नर और मादा बाल कक्षाओं में लिखा गया है।

import java.util.ArrayList; 

class Human 
{ 
    private String name; 
    public Human (String name) 
    { 
    this.name = name; 
    } 
    public String getName() 
    { 
    return name; 
    } 
    public void eat() 
    { 
    System.out.println(name + " went to fridge."); 
    } 
} 

class Male extends Human 
{ 
    public Male(String name) 
    { 
    super(name); 
    } 
    public void goPee() 
    { 
    System.out.println(getName() + " stood up."); 
    } 
} 

class Female extends Human 
{ 
    public Female(String name) 
    { 
    super(name); 
    } 
    public void goPee() 
    { 
    System.out.println(getName() + " sat down."); 
    } 
} 

public class TestHuman 
{ 
    public static void main(String[] args) 
    { 
    ArrayList<Human> arr = new ArrayList<Human>(); 
    arr.add(new Male("john")); 
    arr.add(new Female("sally")); 
    for (int count = 0; count < arr.size(); count++) 
    { 
     arr.get(count).eat(); 
     arr.get(count).goPee(); 
    } 
    } 
} 
+0

मुझे पता है कि इसे कैसे कोड करें। आपने क्या प्रयास किया है आपके क्या विचार हैं? – Jeffrey

+15

मुझे प्रश्न देखने के लिए ठीक है +1। –

+0

आपके सभी कोड जानते हैं कि आप ऐसी सूची से निपट रहे हैं जिसमें 'मानव' ऑब्जेक्ट्स हैं। इसलिए, आपको मानव के सदस्यों से निपटने की अनुमति है। आपकी वांछित विधि मानव पर नहीं है। समस्या देखें? –

उत्तर

7

आप मानव कक्षा में एक goPee() विधि परिभाषित करना होगा। चूंकि आप इसे दोनों उप-वर्गों में ओवरराइड कर रहे हैं, यह एक सार विधि हो सकता है। इसका यह भी अर्थ है कि मनुष्य अमूर्त होना चाहिए।

abstract class Human 
{ 
    private String name; 
    public Human (String name) 
    { 
    this.name = name; 
    } 
    public String getName() 
    { 
    return name; 
     } 
    public void eat() 
    { 
    System.out.println(name + " went to fridge."); 
    } 
    public abstract void goPee(); 
} 

मानव में एक सार विधि की घोषणा सुनिश्चित करता है मानव के सभी उपवर्गों को लागू है कि एक ही मापदंड और वापसी प्रकार के साथ goPee() विधि। यह आपको यह जानने के बिना goPee() को मानव पर कॉल करने की अनुमति देता है कि यह पुरुष या महिला है, क्योंकि आप इसे लागू करने के बारे में जानते हैं।

5

आदेश उपवर्गों की विधि polymorphically कॉल करने के लिए सक्षम होने के लिए है, तो आप आधार वर्ग में समान हस्ताक्षर से एक विधि को परिभाषित करने की जरूरत है।

abstract class Human { 
    public abstract void goPee(); 
} 

आप वर्ग सार बनाने की जरूरत नहीं है, लेकिन इस मामले में यह समझ में आता है ऐसा करने के लिए, क्योंकि वहाँ कोई लिंगहीन मनुष्य हैं। हालांकि, अगर आप साझा करने के लिए व्युत्पन्न वर्ग के तरीकों के बीच कुछ कार्यान्वयन चाहते हैं, तो आप आम कोड आधार वर्ग कार्यान्वयन में डाल सकता है:

class Human { 
    public void goPee() { 
     System.out.println(getName() + " lifted the cover."); 
    } 
} 

class Male extends Human { 
    public void goPee() { 
     super.goPee(); 
     System.out.println(getName() + " stood up."); 
    } 
} 

class Female extends Human { 
    public void goPee() { 
     super.goPee(); 
     System.out.println(getName() + " sat down."); 
    } 
} 
+0

मुझे यकीन है कि यदि आपके पास कक्षा में एक अमूर्त विधि है, तो जावा एक त्रुटि फेंक देगा जब तक कि वर्ग भी अमूर्त न हो। – MALfunction84

+0

@ MALFunction84 बेशक javac एक त्रुटि रिपोर्ट करेगा यदि एक सार तत्व गैर-सारणी वर्ग में पाया जाता है। लेकिन आपको जरूरी तरीके से विधि को बनाने की आवश्यकता नहीं है (मैंने इस बिंदु को स्पष्ट करने के लिए उत्तर अपडेट किया है)। – dasblinkenlight

0

आपका मौलिक मुद्दा यह है कि आप एक मानव संदर्भ पर एक विधि को कॉल करने का प्रयास कर रहे हैं जो मौजूद नहीं है।

यदि आप ऑब्जेक्ट को नर या मादा ऑब्जेक्ट पर सही ढंग से डालें, तो आप पाएंगे कि आप विधि को कॉल कर सकते हैं। चूंकि आपका कंटेनर केवल आपकी बेस क्लास के बारे में जानता है, इसलिए आपको वहां विधि को परिभाषित करने की आवश्यकता होगी, और फिर बहुरूपता मानव संदर्भ से जुड़े प्रकार में सही परिभाषा को कॉल करेगी। (यानी एक पुरुष या महिला वस्तु)

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