2015-08-09 10 views
6

में विधि से अमूर्त सुपर-क्लास में कुछ निश्चित तरीकों को बुलाया जाता है, मेरे पास एक विधि doSomething() विधि वाला एक सार सुपर क्लास ए है। A की उप-वर्ग को doSomething() लागू करना होगा, लेकिन कुछ सामान्य कोड भी हैं जिन्हें हर बार उप-वर्ग कॉल doSomething() पर कॉल किया जाना चाहिए। मैं जानता हूँ कि यह इस प्रकार प्राप्त किया जा सकता:कैसे सुनिश्चित करें कि उप-वर्ग (जावा)

public class A { 
    public void doSomething() { 
    // Things that every sub-class should do 
    } 
} 

public class B extends A { 
    public void doSomething() { 
    super.doSomething(); 
    // Doing class-B-specific stuff here 
    ... 
    } 
} 

इस के साथ तीन मुद्दों, हालांकि होने लगते हैं:

  • विधि हस्ताक्षर मिलान करने के लिए है, लेकिन मैं उप में कुछ वापस जाने के लिए चाहते हो सकता है क्लास विधियों केवल, लेकिन सुपर-क्लास
  • में नहीं यदि मैं एडोसोमिंग() सार बना देता हूं, तो मैं ए में एक (सामान्य) कार्यान्वयन नहीं कर सकता। अगर मैं इसे सार नहीं बनाता, तो मैं नहीं कर सकता इसे लागू करने के लिए उप-वर्ग बल।
  • यदि मैं सामान्य कार्यक्षमता प्रदान करने के लिए एक अलग विधि का उपयोग करता हूं, तो मैं उस विधि को लागू नहीं कर सकता। BdoSomething() सामान्य विधि को कॉल करता है।

कोई विचार कैसे तरीकों को लागू किया जाना चाहिए?

उत्तर

0

ऐड कॉल बैक DoSomething()

public class A { 
    public void doSomething() { 
    // Things that every sub-class should do 
    doSomethingMore() 
    } 
} 

protected abstract void doSomethingMore() 

के लिए इतना सब subclusses अतिरिक्त कार्यों के साथ doSomethingMore() ipmelment करना होगा लेकिन सार्वजनिक DoSomething()

+0

मैं 'शून्य' को 'सार्वजनिक शून्य' में कुछ जोड़ दूंगा() '। यह गारंटी देनी चाहिए कि इसे उप-वर्ग द्वारा ओवरराइड नहीं किया जा सकता है (जो बेवकूफ कोडर (मुझे 2 महीने में) कर सकता है)। – RowlandB

6

निम्नलिखित के बारे में क्या?

public abstract class A { 
    protected abstract void __doSomething(); 

    public void doSomething() { 
    // Things that every sub-class should do 
    __doSomething(); 
    } 
} 

public class B extends A { 
    protected void __doSomething() { 
    // Doing class-B-specific stuff here 
    ... 
    } 
} 

हालांकि पहला बुलेट बिंदु इतना स्पष्ट नहीं है। यदि आप कुछ अलग करना चाहते हैं तो हस्ताक्षर मिलान नहीं कर सकता है।

+0

ओपी कुछ वापस करना चाहता है, तो आप '__do कुछ() 'रिटर्न प्रकार को सामान्य प्रकार' टी' में बदल सकते हैं। – ka4eli

+0

बहुत बहुत धन्यवाद, इस तरह (कचनोव के समान) मेरे उद्देश्य के लिए काम करता है। वापसी मूल्य के साथ चीज़ के बारे में अस्पष्ट होने के लिए खेद है, लेकिन कॉलबैक तंत्र का उपयोग वापसी मूल्य समस्या हल करता है। –

0

पहला बिंदु अकेले के लिए बाहरी वर्गों कॉल करेंगे - आप नीचे दिए गए उत्तर पर विचार कर सकते हैं और सबक्लास कार्यान्वयन को लागू करने के लिए यह सार हो सकता है लेकिन सामान्य श्रेणी कार्यक्षमता को कॉल करना तब हो सकता है जब बेस क्लास में कुछ कार्यान्वयन हो।

रिटर्न प्रकार बेस क्लास में ऑब्जेक्ट हो सकता है और शून्य लौटा सकता है। सबक्लास में विशिष्ट रिटर्न प्रकार नीचे दिए गए अनुसार रखा जा सकता है।

public class InheritanceTutorial { 

    static class Base{ 
     public Object doSomething(){ 
      System.out.println("parent dosomething"); 
      return null; 
     } 
    } 

    static class SubClass extends Base{ 
     public Integer doSomething(){ 
      super.doSomething(); 
      System.out.println("child dosomething"); 
      return 0; 
     } 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SubClass subClass = new SubClass(); 
     subClass.doSomething(); 
    } 

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