2012-05-17 10 views
10

निम्नलिखित वर्गकॉल सुपर वर्ग विधि स्वतः

class A{ 
    public void init(){ 
     //do this first; 
    } 
    public void atEnd(){ 
     //do this after init of base class ends 
    } 
} 

class B1 extends A{ 

    @Override 
    public void init() 
    { 
     super.init(); 
     //do new stuff. 
     //I do not want to call atEnd() method here... 
    } 
} 

मैं कई B1, B2, ... बटालियन बच्चे वर्ग है जो पहले से ही विकसित कर रहे हैं है पर विचार करें। उनमें से सभी कक्षा ए का विस्तार करते हैं। यदि मैं उन सभी में एक नई कार्यक्षमता जोड़ना चाहता हूं, तो ऐसा करने के लिए सबसे अच्छी जगह कक्षा ए के भीतर एक विधि में परिभाषित की गई है लेकिन शर्त यह है कि विधि को हमेशा पहले ही स्वचालित रूप से कॉल किया जाना चाहिए बाल वर्ग समाप्त होता है init() विधि। ऐसा करने का एक मूल तरीका है कि बाल कक्षाओं की init() विधि के अंत में फिर से अंत() विधि कॉल जोड़ें। लेकिन क्या यह स्मार्ट तरीके से करने का कोई और तरीका है ??

उत्तर

19

एक ही रास्ता , विधि:

abstract class A { 
    public final void init() { 
    // insert prologue here 
    initImpl(); 
    // insert epilogue here 
    } 
    protected abstract void initImpl(); 
} 

class B extends A { 
    protected void initImpl() { 
    // ... 
    } 
} 

जब भी किसी को भी कॉल init(), प्रस्तावना और उपसंहार स्वचालित रूप से क्रियान्वित कर रहे हैं, और व्युत्पन्न वर्ग नहीं है एक काम करना है।

3

init()final बनाओ, और लोगों को ओवरराइड करने के लिए के लिए है कि बीच में init() कॉल एक अलग तरीका प्रदान: init() अंतिम बनाने और, overridable एक दूसरे को इसके संचालन सौंपने के द्वारा होता है यह करने के लिए

class A{ 
    public final void init(){ 
     //do this first; 
    } 

    protected void initCore() { } 

    public void atEnd(){ 
     //do this after init of base class ends 
    } 
} 

class B1 extends A{ 

    @Override 
    protected void initCore() 
    { 
     //do new stuff. 
    } 
} 
4

एक और विचार एक पहलू में बुनाई होगी। पॉइंटकट पर सलाह देने से पहले और बाद में जोड़ें।

+0

यदि यह क्लास इनवेरिएंट की सुरक्षा के बारे में है, तो एओपी बहुत खराब समाधान होगा। –

+0

यह "सामान" के बारे में है; इनवेरिएंट का उल्लेख नहीं किया गया है। और मुझे यकीन नहीं है कि आपूर्ति की गई जानकारी के आधार पर "बहुत गरीब" उपयुक्त है। – duffymo

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