2013-01-23 12 views
8

है कि ओवरराइड करने के लिए बच्चे को मजबूर करने के लिए परिदृश्य है -> 3 श्रेणियां हैं कल्पना, मैं की तरह की कुछ नया कर सके हैं:एंड्रॉयड - कैसे माता पिता विधि यहाँ कोड

public class GameObject { 
    public void updateBounds() { 
     // do something 
    } 
} 

public abstract class Enemy extends GameObject { 
    public abstract void updatePosition(){ //<-- this will not compile, 
            //but this is what i want to do, to force 
            //child to override parent method 
     updateBounds(); 
    } 

} 

public class Minion extends Enemy { 
    @Override 
    public void updatePosition() { 
     super.updatePosition(); // <-- how do i throw an exception if this line 
           // is not called within this method of the 
           // child? 
     // now do something extra that only Minion knows how to do 
    } 
} 
  • कैसे आप डिजाइन करते हैं दुश्मन वर्ग ताकि उसके पास कोई तरीका हो जो कुछ करता है, लेकिन हर बच्चे को इसे ओवरराइड करने की आवश्यकता होती है?
  • माता-पिता की विधि को कॉल करने के लिए आप बच्चे को किस प्रकार बल देते हैं (जिसे विधि को ओवरराइड करना था)?

यह लगभग एंड्रॉइड की Activity कक्षा की तरह है जिस पर ऑनक्रेट, ऑनस्टार्ट, ऑनर्यूम ... आदि है। विधियां जो वैकल्पिक हैं, लेकिन यदि आप इसका उपयोग करते हैं, तो यह आपको सुपर कॉल करने के लिए मजबूर करता है। यह सार नहीं हो सकता है क्योंकि जब विधि कहा जाता है तो मैं कुछ कोड चलाने के लिए चाहता हूं (जो केवल मूल वर्ग की विधि में है)। बोनस अंक यदि आप जानते हैं कि उन्होंने इसे कैसे किया?

+2

आपके प्रयास के लिए अपवर्तित होती है। – Raj

उत्तर

5

एंड्रॉयड सूत्रों का कहना है एक बूलियन का उपयोग mCalled कि अर्ध सार विधि कार्यान्वयन के अंदर सही पर सेट है कहा जाता है। आपके मामले में यह मूल updatePosition() के अंदर होगा।

फिर जब आप updatePosition() कॉल करना चाहते हैं, यह इस के माध्यम से फोन:

private void performUpdatePosition() { 
    mCalled = false; 
    updatePosition(); 
    if (!mCalled) throw new SuperNotCalledException(); 
} 

और updatePosition() इस

protected void updatePosition() { 
    mCalled = true; 
    updateBounds(); 
} 

संपादित करें दिखाई देगा:

अब मैं इसके बारे में लगता है कि, जिस तरह से एंड्रॉइड यह थोड़ा दौर है। चूंकि सभी कॉल updatePosition()performUpdatePosition() से गुजर रहे हैं, तो अब आपको updatePosition() के अंदर कुछ कोड रखने की आवश्यकता नहीं है जिसे ओवरराइड किया जा सकता है, लेकिन नहीं होना चाहिए।

एक बहुत बेहतर दृष्टिकोण बस performUpdatePosition() करने के लिए आवश्यक कार्रवाई ले जाने के लिए है:

private void performUpdatePosition() { 
    updateBounds(); 
    updatePosition(); 
} 

protected void updatePosition() { 
    //Do nothing by default 
} 

इस तरह कॉल प्राप्त करने वाला super.updatePosition बुला के बारे में चिंता करने की ज़रूरत नहीं है। यदि सबक्लास उस फ़ंक्शन को ओवरराइड नहीं करता है, तो कुछ अतिरिक्त नहीं होगा, जबकि यदि वे करते हैं, तो ओवरराइड पिछले व्यवहार में जोड़ देगा।

+0

हम्म ... ठीक है। मैं उम्मीद कर रहा था कि जावा में पहले से ही अधिक बेक्ड-इन समाधान होगा जो मुझे पता नहीं है। लेकिन मुझे लगता है कि इस हैक को अभी के लिए करना होगा। धन्यवाद!!! upvoted (कुछ दिन पहले) और –

+0

स्वीकार किया मैंने इस समस्या को हल करने के लिए एक और (बेहतर) विधि देकर सवाल संपादित किया है। –

-3

कैसे

के बारे में
public abstract class Enemy extends GameObject{ 
    public abstract void updatePositionCommon(){ 
     //code common to all 

     updatePosition(); 
    } 
    public abstract void updatePosition(){ 
     //override this method in children 
    } 

} 
+6

अमूर्त तरीकों में शरीर नहीं हो सकते हैं। –

-1

आप एनीमी क्लास को कैसे डिजाइन करते हैं ताकि इसमें एक विधि हो जो कुछ करे, लेकिन प्रत्येक बच्चे को इसे ओवरराइड करने की आवश्यकता है?

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

माता-पिता की विधि को कॉल करने के लिए आप बच्चे को किस प्रकार बल देते हैं (जिसे विधि को ओवरराइड करना पड़ता है)?

यदि पैरेंट क्लास अमूर्त वर्ग है तो एक विधि ओवरराइड किया जाता है।

+1

ओपी 'अपडेटपॉजिशन()' के दौरान कुछ सामान्य कोड के निष्पादन को मजबूर करने में सक्षम होना चाहता है और फिर भी अगर यह सामान्य कोड नहीं दबाता है तो अपवाद फेंक कर इसे ओवरराइड करने की अनुमति देता है। –

4
हो सकता है आप बच्चे को विधि कॉल करने के बजाय

, आप वर्ग

public void updatePosition() 
{ 
    //do what you need to do before the child does it's stuff 
    onUpdatePosition(); 
    //do what you need to do after the child does it's stuff 
} 

protected abstract void onUpdatePosition(); 

है कि रास्ते में एक आधार विधि निर्धारित कर सकते हैं, जैसा कि आप updatePosition() कहते हैं, बच्चे को यह खुद onUpdatePosition है के लिए() है और आप जानते हैं कि माता-पिता की सामग्री हर बार

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