2015-01-21 7 views
5

के भीतर से सुपर विधि को कॉल करना एक मस्तिष्क-बहन उदाहरण के रूप में मेरा एक प्रोफेसर ने हमें विरासत के बारे में जानने के लिए अभ्यास का पालन किया। हमें आउटपुट का पता लगाना पड़ा।सुपर क्लास

//java 
public class A { 
    public void f() { 
     System.out.println("A -> f()"); 
     x = x + 4; 
     if (x < 15) this.f(); //the f-call 
    } 
    public int x = 5; 
} 

public class B extends A { 
    @Override 
    public void f() { 
     System.out.println("B -> f()"); 
     x = x + 3; 
     super.f(); 
    } 
} 

public class Main { 
    public static void 
    main(String[] args) { 
     A a = new B(); 

     System.out.println("a.f()"); 
     a.f(); 
     System.out.println(a.x); 
    } 
} 

उत्पादन, जैसा कि मैंने उम्मीद थी, है

  • वायुसेना()
  • बी -> च()
  • A -> च()
  • बी -> f ()
  • A -> च()

हालांकि, अब मैं सोच रहा था। एफ-कॉल को ए में एफ विधि कॉल करने का कोई तरीका है, भले ही मैं इसे बी-ऑब्जेक्ट से उपयोग करता हूं, जिस तरह से मैं सुपर बीएफ() का उपयोग करके ए में बी से कॉल करता हूं। । तो उत्पादन बन जाएगा (मुझे लगता है कि):

  • वायुसेना()
  • बी -> च()
  • A -> च()
  • A -> च()

क्या यह संभव है? और यदि हां, तो कैसे?

नोट: मुझे यकीन है कि क्या इस के व्यावहारिक अनुप्रयोग होगा नहीं कर रहा हूँ, मैं सिर्फ कुछ नया सीखने की कोशिश कर रहा हूँ: पी

+0

तो अनिवार्य रूप से, आप स्वयं को कॉल करने की विधि चाहते हैं?मुझे नहीं लगता कि आप ऐसा कर सकते हैं –

+0

हां, यह वही है जो मैं करना चाहता हूं। –

+0

@ चार्ल्सविटफील्ड बेशक एक विधि स्वयं को कॉल कर सकती है। इसे एक पुनरावर्ती विधि कहा जाता है। ओपी का सवाल यह है कि क्या माता-पिता वर्ग के भीतर से किसी विधि के मूल संस्करण को निर्दिष्ट करना संभव है। – shmosel

उत्तर

5

संक्षिप्त उत्तर है "नहीं" यदि आप ऐसा नहीं कर सकते हैं।

लंबा उत्तर यह है कि इससे विरासत के बारे में सभी प्रकार की गारंटीएं टूट जाएंगी। आपकी बी कक्षा ने अनिवार्य रूप से कहा है "अब मैं public void f() के लिए कैननिकल विधि प्रदान करता हूं"। चूंकि B कहा गया तरीका प्रदान कर रहा है, इसे उपयोग करने के लिए माता-पिता को वापस कॉल करने की अनुमति है (और ऐसा कुछ जो करने के लिए बहुत उपयोगी चीज है)।

यदि A को ऐसा करने की अनुमति थी तो यह अनिवार्य रूप से व्यवहार को छोड़कर B ओवरराइड करना चाहता है।

कई प्रकार के पैटर्न उपलब्ध हैं जो आपको समान व्यवहार प्रदान करते हैं, उदा। the Template Pattern

2

क्योंकि बहुरूपता एक सुपर क्लास वस्तु के सभी तरीकों के लिए लागू होगी, f उस वस्तु के क्रम प्रकार हमेशा की है कि हो जाएगा कहा जाता है - इस मामले में, B में है, इसलिए B के f विधि हमेशा बुलाया जाएगा। जावा में इसे बदला नहीं जा सकता है।

आप एक private विधि, कहते हैं, foo में A के f विधि का काम कर रही इस पर काम करने के लिए इतना है कि जब f कहा जाता है, foo बार-बार कहा जाता है कर सकता है। A:

public void f() 
{ 
    foo(); 
} 

private void foo() { 
    System.out.println("A -> f()"); // Lie. 
    x = x + 4; 
    if (x < 15) this.foo(); //the "f"-call 
} 
संबंधित मुद्दे