2016-10-27 11 views
6

एंड्रॉइड में मैं एक अमूर्त वर्ग बनाता हूं जो View (एक एंड्रॉइड क्लास जिसमें मुझे कोई एक्सेस नहीं है) बढ़ाता है। सार वर्ग दृश्यक्या अंतिम कीवर्ड को विरासत/ओवरराइड विधि में जोड़ने के लिए "ठीक" है?

@Override 
protected final void onDraw(Canvas canvas) { 
    if(conditions) return;   

    // child classes should only draw if this class gives the ok 
    subDraw(canvas); 
} 

protected abstract void subDraw(Canvas canvas); 

लेकिन मैं अंतिम कीवर्ड यहां जोड़ ओवरराइड करता है।

बिंदु यह है कि, मैं एक अमूर्त विधि बनाता हूं जो सबक्लास को ऑनड्रा के बजाय उपयोग करना चाहिए। इसलिए मैं ऑनड्रा को किसी भी आगे ओवरराइड होने से रोकता हूं और यह काम करता है।

मुझे पता है कि इसे बेहतर बनाने के लिए डिज़ाइन हैं, हालांकि यह बहुत सारे बदलाव के बिना आकर्षण की तरह काम करता है। मेरा प्रश्न सामान्य रूप से सामान्य है यदि उपर्युक्त करने से रनटाइम या अन्य मुद्दों पर अवांछित दुष्प्रभाव होते हैं?

+5

हाँ, यदि वह 'व्यवहार जो आप चाहते हैं और आप जानते हैं कि आप क्या कर रहे हैं – Blackbelt

+0

यह वही है जो मैं चाहता हूं – NikkyD

+0

साइड इफेक्ट यह है कि यह आपके उप-वर्गों को (इकाई-) परीक्षण को कठिन बनाता है। ऐसा इसलिए है क्योंकि आप इस विधि का नकल नहीं कर सकते हैं। और इसलिए आप इस कक्षा के व्यवहार से उप-वर्ग व्यवहार को अलग नहीं कर सकते हैं। इसे हल करने के तरीके हैं, लेकिन "विरासत पर अनुकूलता" दृष्टिकोण का उपयोग करके आपका आवेदन डिज़ाइन सबसे अच्छा होगा। –

उत्तर

2

हां, तकनीकी रूप से यह एक साफ समाधान है। यदि आप पूरी तरह से सुनिश्चित हैं कि कोई ऐसी स्थिति नहीं है जब कोई इस विशेष विधि के अंदर कोई तर्क बदलना चाहें तो आप ऐसा कर सकते हैं।

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

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