2013-02-22 18 views
15

में एक चर सेट करने के लिए फोर्स उप-वर्गों को मैं एंड्रॉइड में विकसित कर रहा हूं और अपेक्षाकृत सरल स्थिति है कि मैं संभवतः सर्वोत्तम तरीके से कार्यान्वित करने की कोशिश कर रहा हूं।जावा

बस, मेरे पास एक कक्षा है जो किसी दिए गए स्क्रीन के सभी बुनियादी मानकों को परिभाषित करती है। यहां से एप्लिकेशन में प्रत्येक स्क्रीन इस का एक उप-वर्ग है। मुझे प्रत्येक स्क्रीन (यानी सबक्लास) को इसके कार्यान्वयन में एक चर के मान को सेट करने की आवश्यकता है (यानी, प्रत्येक स्क्रीन को परिभाषित करना चाहिए कि नेविगेशन पेड़ में यह किस स्तर पर है)।

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

इस बारे में जाने का सबसे अच्छा तरीका क्या है? जावा में इस प्रकार के व्यवहार को सही तरीके से लागू करने का कोई तरीका है?

+3

यह एक चर के साथ नहीं किया जा सकता है। लेकिन एक अमूर्त वर्ग की आवश्यकता हो सकती है कि एक विशेष विधि लागू की गई हो: यह विधि लागू मूल्य वापस कर सकती है। –

+0

धन्यवाद! मैंने उस मार्ग पर जाने की कोशिश की थी और मैं फंसे हुए अमूर्त समारोह को कैसे मजबूर कर सकता हूं। मेरे पास दिमाग खाली था और नो-एर्ग कन्स्ट्रक्टर के बारे में भूल गया था और अमूर्त रचनाकारों की तरह चीजों की कोशिश कर रहा था .... –

उत्तर

27

@ pst की टिप्पणी इस समाधान का कारण बनती है।

यह एक चर के साथ नहीं किया जा सकता है। लेकिन एक अमूर्त वर्ग की आवश्यकता हो सकती है कि एक विशेष विधि कार्यान्वित किया जाता है: इस विधि लागू मूल्य

लौट सकते हैं सेट या चर वापस जाने के लिए एक abstract समारोह की घोषणा से, आप इसे सही ढंग से लागू करने के लिए किसी भी उपवर्ग मजबूर कर सकते हैं।

अगला, फ़ंक्शन को बाहरी वर्ग के प्रत्येक एकल वर्ग द्वारा बुलाया जाना चाहिए। इसका तात्पर्य है कि इसे बाहरी वर्ग में कहीं भी किया जाना चाहिए।

नोट:: यह उपवर्गों super बुला के बारे में चिंता किए बिना बाहरी वर्ग का कोई तर्क निर्माता में किया जा सकता एक निर्माता स्पष्ट रूप से एक सुपर क्लास निर्माता आह्वान नहीं करता है, जावा स्वचालित रूप से करने के लिए एक कॉल सम्मिलित करता है superclass के नो-तर्क कन्स्ट्रक्टर। यदि सुपर क्लास में कोई तर्क-तर्क कन्स्ट्रक्टर नहीं है, तो आपको संकलन-समय त्रुटि मिल जाएगी। ऑब्जेक्ट में ऐसा कन्स्ट्रक्टर होता है, इसलिए यदि ऑब्जेक्ट एकमात्र सुपरक्लास है, तो कोई समस्या नहीं है। (Java docs: Super)

उस आधार पर, इस समाधान तक रख सकता है और सही ढंग से बल चर के रूप में लंबे समय के रूप में सेट किया जा करने के लिए या तो:

  1. कोई अन्य निर्माता (सुपर क्लास में बनाया गया है और इसलिए सुपर कर सकते हैं इसके बजाय एक अलग कन्स्ट्रक्टर को कॉल करने के लिए उप-वर्ग में उपयोग नहीं किया जाएगा)
  2. सुपरक्लास में अन्य सभी निर्माता अभी भी डिफ़ॉल्ट कन्स्ट्रक्टर को आंतरिक रूप से
पर कॉल करते हैं

कोड:

सुपर क्लास:

public abstract class SuperClass { 
    // Variable all inner classes must set 
    static int myVar = 0; 

    public SuperClass() { 
     myVar = giveValue(); 
    } 

    public abstract int giveValue(); 
} 

उपवर्ग:

public class SubClass extends SuperClass { 

    @Override 
    public int giveValue() { 
     return 5; // individual value for the subclass 
    } 

} 
+1

धन्यवाद! मेरा दिन बचाया !! – DevAndroid

8

बच्चे वर्गों को फ़ील्ड शुरू करने के लिए लागू करने के बजाय, आप अपनी कक्षा के निर्माता को एक इंटरफ़ेस को लागू करने वाले पैरामीटर को लेकर पैरामीटर ले सकते हैं जो फ़ील्ड को प्रारंभ करना चाहते हैं।