2013-03-27 11 views
32

पर ओवरराइड विधि को कैसे कॉल करें Animal कक्षा के खाने और पेय विधि को कोड में myAnimal उदाहरण के साथ कैसे कॉल कर सकता हूं?सुपरक्लास

public class Animal { 
    public void eat() { 
     System.out.println("Animal Eats"); 
    } 

    public void drink() { 
     System.out.println("Animal Drinks"); 
    } 
} 

public class Cat extends Animal { 
    @Override 
    public void eat() { 
     System.out.println("Cat Eats"); 
    } 

    @Override 
    public void drink() { 
     System.out.println("Cat Drinks"); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     myCat.eat(); 
     myCat.drink(); 

     Animal myAnimal = myCat;   
     myAnimal.eat(); 
     myAnimal.drink(); 
    } 
} 

आउटपुट है कि मैं हो रही है:

Cat Eats 
Cat Drinks 
Cat Eats 
Cat Drinks 

यह मेरा अपेक्षित आउटपुट:

Cat Eats 
Cat Drinks 
Animal Eats 
Animal Drinks 
+1

आप बिना 'animal' कार्यान्वयन ** कॉल करना चाहते हैं ** 'बिल्ली' कार्यान्वयन? – mthmulders

+4

जब तक आपके पास 'बिल्ली' चुड़ैल में कोई विधि नहीं है, तो super.eat(); 'आप इसे सीधे' बिल्ली ' – A4L

+0

से नहीं कर सकते हैं, आपको उम्मीद नहीं करनी चाहिए कि आप क्या उम्मीद कर रहे हैं ... दोनों के मामले में नहीं होना चाहिए भाषा परिभाषा और उचित या वांछनीय क्या है के संदर्भ में। विरासत बहुरूपता का पूरा बिंदु यह है कि आप जो देख रहे हैं उसे प्राप्त करें और जो भी आप कहते हैं वह नहीं। –

उत्तर

55

आप आप क्या चाहते हैं नहीं कर सकते। जिस तरह से आप देख रहे हैं वह कर कर पॉलिमॉर्फिज्म काम करता है।

असल में एक बिल्ली हमेशा जानता है कि यह एक बिल्ली है और यदि आप एक बिल्ली, फेलिस, फेलिना, फेलिडे, फेलिफॉर्मिया, कार्निवोरा, थ्रिया, मामालिया, वेरटेब्रेटा, चोरदाता, यूमेटाज़ोआ, के रूप में व्यवहार करते हैं, तो हमेशा बिल्ली की तरह व्यवहार करेंगे। पशु, पशु, वस्तु, या :-)

+2

क्या आप इसके बारे में निश्चित हैं। –

+1

100% निश्चित रूप से वह कोड दिया गया है जिसे आप लिखना चाहते हैं। मैं एक और उत्तर पोस्ट करूंगा जो आपको वह करने देगा जो आप करने की कोशिश कर रहे हैं, लेकिन यह नहीं होगा कि आप क्या करना चाहते हैं ... – TofuBeer

+0

मैंने इस धागे पर प्रतिबिंब डाला – WeMakeSoftware

5

इस लाइन कुछ और:

Animal myAnimal = myCat;

वस्तु myCat, आप द्वारा पहले बनाई गई जो करने के लिए चर myAnimal प्रदान करती है। तो जब आप इसके बाद myAnimal.eat() पर कॉल करते हैं, तो आप वास्तव में मूल myCat ऑब्जेक्ट की विधि को कॉल कर रहे हैं, जो Cat Eats आउटपुट करता है।

आप उत्पादन Animal Eats करना चाहते हैं, तो आप एक चर के लिए एक Animal उदाहरण आवंटित करने के लिए होगा। तो अगर आप इस बजाय करना होगा:

Animal myAnimal = new Animal()

चर myAnimal Animal का एक उदाहरण हो जाएगा, और इस तरह Cat को पूर्व नियत कार्य निरस्त हो जाएंगे।

यदि आप myAnimal.eat() इस के बाद कॉल करेंगे, आप वास्तव में Animal उदाहरण के eat() विधि कॉल कर रहे हैं आपके द्वारा बनाया गया है, जो होगा उत्पादन Animal Eats

समापन: अपने कोड को पढ़ने के लिए चाहिए:

public class Cat extends Animal { 

    @Override 
    public void eat() { 
     System.out.println("Cat Eats"); 
    } 

    @Override 
    public void drink() { 
     System.out.println("Cat Drinks"); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     myCat.eat(); 
     myCat.drink(); 

     Animal myAnimal = new Animal();   
     myAnimal.eat(); 
     myAnimal.drink(); 
    } 
} 
-1

कृपया इस जवाब पर वोट नहीं है ... आप एक दूसरे पर मतदान कर सकते :-) यह एक बुरा जवाब है, लेकिन पता चलता है आप कैसे होगा जो भी आप करने की कोशिश कर रहे हैं वह करो ... खराब।

public class Main 
{ 
    public static void main(final String[] argv) 
    {   
     Child child; 
     Parent parent; 

     child = new Child(); 
     parent = child; 

     child.a(); 
     parent.a(); 
     child.otherA(); 
     parent.otherA(); 
    } 
} 

class Parent 
{ 
    public void a() 
    { 
     System.out.println("Parent.a()"); 
    } 

    public void otherA() 
    { 
     // doesn't matter what goes here... really should be abstract 
    } 
} 

class Child 
    extends Parent 
{ 
    @Override 
    public void a() 
    { 
     System.out.println("Child.a()"); 
    } 

    @Override 
    public void otherA() 
    { 
     super.a(); 
    } 
} 
+3

यदि आप स्वयं को स्वीकार करते हैं तो यह एक बुरा जवाब है और इसका उपयोग नहीं किया जाना चाहिए, शायद इसे हटाने के लिए शायद बेहतर है। – Rob

+2

वास्तव में नहीं, यह लोगों को दिखाने के लिए है कि क्या नहीं करना है। कोई भी इसके साथ आ सकता है, मैं लोगों को यह बताना चाहता था कि अगर उन्होंने ऐसा किया तो उन्हें इसे फेंक देना चाहिए। इसलिए मेरा अनुरोध बिल्कुल इस पर मतदान नहीं करने के लिए ... – TofuBeer

+5

मुझे लगता है कि यह बेहतर होगा अगर यह आपके स्वीकृत उत्तर का एक अनुभाग था। –

0

बिल्ली बिल्ली होने से रोक नहीं सकती है, भले ही यह एक जानवर हो। बिल्ली खाएगी और बिल्ली बिल्ली के रास्ते में पीएगी। यह एक जानवर के समान ही हो सकता है, यही कारण है कि यह विधि को ओवरराइड करता है। यदि आप इसे करना चाहते हैं तो पशु डिफ़ॉल्ट रूप से क्या करता है, ओवरराइड न करें। आप शायद प्रतिबिंब के साथ कुछ अजीब चीजें करते और अलग तरीकों कि जैसे माता पिता के तरीकों का उपयोग कर सकता है:

public void superDrink() { 
    Animal.class.getMethod("drink").invoke(); 
} 

लेकिन वह जा overkill आपको नहीं लगता कि हो सकता है?

बेशक यह संभवतः काम नहीं करेगा क्योंकि यह स्थैतिक नहीं है।

public class Cat extends Animal { 

    public void superEat() { 
     super.eat(); 
    } 

    public void superDrink() { 
     super.drink(); 
    } 

    @Override 
    public void eat() { 
     System.out.println("Cat Eats"); 
    } 

    @Override 
    public void drink() { 
     System.out.println("Cat Drinks"); 
    } 
} 
+0

java.lang.NoSuchMethodException –

16

यहाँ आप जो विधि आप आह्वान करना चाहते हैं चुनने का विकल्प होगा।

public class Animal { 
    public static void eat() { 
     System.out.println("Animal Eats"); 
    } 

    public static void drink() { 
     System.out.println("Animal Drinks"); 
    } 
} 


public class Cat extends Animal { 
    @Override 
    public static void eat() { 
     System.out.println("Cat Eats"); 
    } 

    @Override 
    public static void drink() { 
     System.out.println("Cat Drinks"); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     myCat.eat(); 
     myCat.drink(); 

     Animal myAnimal = myCat;   
     myAnimal.eat(); 
     myAnimal.drink(); 
    } 
} 

ऊपर कोड निम्न उत्पादन

Cat Eats 
Cat Drinks 
Animal Eats 
Animal Drinks 
1

आप प्रत्येक वर्ग में तरीकों स्थिर करते हैं, तो यह काम करना चाहिए:

+4

मुझे नहीं लगता कि ओपी क्या मांग रहा है, वह तत्काल ऑब्जेक्ट में ओवरराइड विधि तक पहुंचने में सक्षम होना चाहता है, मैं ऑब्जेक्ट को फिर से डिजाइन करने जैसी कुछ और चीज़ों के लिए जाऊंगा, आवश्यकता है – Goodwine

2

आप वर्ग पशु के लिए निर्माता बना सकते हैं, कि एक प्रदान की के आधार पर पैरामीटर के रूप में एक और Animas लेता है, और बनाता है नया उदाहरण दे देंगे।

public class Animal { 
    //some common animal's properties 
    private int weight; 
    private int age; 

    public Animal() { 
     // empty. 
    } 

    public Animal(final Animal otherAnimal) { 
     this.weight = otherAnimal.getWeight(); 
     this.age = otherAnimal.getAge(); 
    } 

    public void eat() { 
     System.out.println("Animal Eats"); 
    } 

    public void drink() { 
     System.out.println("Animal Drinks"); 
    } 

    // setters and getters. 
} 

public class Cat extends Animal { 
    @Override 
    public void eat() { 
     System.out.println("Cat Eats"); 
    } 

    @Override 
    public void drink() { 
     System.out.println("Cat Drinks"); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     myCat.eat(); 
     myCat.drink(); 

     // note: myAnimal is not a Cat, it's just an Animal. 
     Animal myAnimal = new Animal(myCat);   
     myAnimal.eat(); 
     myAnimal.drink(); 
    } 
} 
+1

इसे सी ++ में "स्लाइसिंग" के रूप में जाना जाता है; आप एक बिल्ली के पैरेंट हिस्से को "एक टुकड़ा" बनाने के लिए एक बिल्ली का उत्पादन करते हैं जो अब बिल्ली नहीं है। यह ओपी के वाक्यविन्यास के समान वाक्यविन्यास का उपयोग कर सी ++ में होता है। जावा में, आपको इसे स्पष्ट रूप से करना होगा। ध्यान दें कि यह एक सुधार है, आकस्मिक टुकड़ा वास्तव में बेकार है। – Yakk

2
  • स्थिर क्षेत्रों, उदाहरण के खेतों और स्थिर तरीकों तक पहुंच संदर्भ चर और नहीं वास्तविक वस्तु जो करने के लिए करने के लिए चर अंकों की वर्ग पर निर्भर करता है।
  • याद रखें कि सदस्य चर छायांकित नहीं हैं, ओवरराइड नहीं हैं।
  • यह उदाहरण विधियों के मामले में क्या होता है इसके विपरीत है।
    उदाहरण विधियों के मामले में ऑब्जेक्ट की वास्तविक श्रेणी की विधि कहा जाता है।

    class ABCD { 
        int x = 10; 
        static int y = 20; 
    
        public String getName() { 
         return "ABCD"; 
        } 
    } 
    
    class MNOP extends ABCD { 
        int x = 30; 
        static int y = 40; 
    
        public String getName() { 
         return "MNOP"; 
        } 
    } 
    
    public static void main(String[] args) { 
    
        System.out.println(new MNOP().x + ", " + new MNOP().y); 
    
        ABCD a = new MNOP(); 
        System.out.println(a.x); // 10 
        System.out.println(a.y); // 20 
        System.out.println(a.getName()); // MNOP 
    } 
    

इस उदाहरण में हालांकि वस्तु myCat एक पशु ऑब्जेक्ट संदर्भ को सौंपा गया है, (Animal myAnimal = myCat) वास्तविक ऑब्जेक्ट प्रकार Cat की है और यह बर्ताव करता है के रूप में यह एक बिल्ली है।

उम्मीद है कि इससे मदद मिलती है।

0

कुछ सुझाव:

  1. सुपर वर्ग के लिए और सुपर वर्ग विधि ओवरराइड विधि के लिए लागू किया जाना है, सिवाय बच्चा कक्षा संदर्भ पारित न करें। सुपर क्लास इंस्टेंस से सुपर क्लास विधियों को कॉल करें।

    Animal myAnimal = new Animal(); 
    myAnimal.eat(); 
    
  2. आप बच्चे को कक्षा से सुपर वर्ग विधि कॉल करना चाहते हैं, स्पष्ट रूप से super.methodName साथ सुपर वर्ग विधि नाम फोन();

    public void eat() { 
        super.eat(); 
        System.out.println("Cat Eats"); 
    } 
    
  3. बाल वर्ग में सुपर क्लास विधि को ओवरराइड न करें। हमेशा सुपर क्लास विधि का आह्वान किया जाता है।
0
public class Main { 
    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     myCat.eat(); 
     myCat.drink(); 

     Animal myAnimal = new Animal(); 
     myAnimal.eat(); 
     myAnimal.drink(); 
    } 
} 

public class Animal { 
    public void eat(){ 
     System.out.println("Animal eat() called"); 
    } 
    public void drink(){ 
     System.out.println("Animal drink() called"); 
    } 
} 

public class Cat extends Animal { 
    @Override 
    public void eat() { 
     System.out.println("Cat eat() called"); 
    } 

    @Override 
    public void drink() { 
     System.out.println("cat drink() called"); 
    } 
} 

उत्पादन:

बिल्ली खाने()

बिल्ली पेय() कहा जाता

पशु खाते हैं() कहा जाता है कहा जाता है

पशु पेय()

बुलाया

अन्य विकल्प के बच्चे कक्षा तरीकों में कीवर्ड super उपयोग करने के लिए है सुपर वर्ग Animal की एक वस्तु बनाने की जरूरत या जैसे, super.eat() या super.drink()

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