2011-09-21 8 views
8

Tips and Techniques for Framework Developers पर एप्पल के प्रलेखन के माध्यम से पढ़ना, मैं नामित initializers के बारे में इस बयान में आए:एक कक्षा में कभी भी एक से अधिक नामित प्रारंभकर्ता होगा?

एक नामित प्रारंभकर्ता एक वर्ग है कि सुपर क्लास के एक init विधि invokes का एक init विधि है। (अन्य प्रारंभकर्ता init कक्षा द्वारा परिभाषित विधियों का आह्वान करते हैं।) प्रत्येक सार्वजनिक वर्ग में एक या अधिक नामित प्रारंभकर्ता होना चाहिए।

(जोर जोड़ा।)

मेरी समझ-और वास्तव में, शब्द के बहुत उपयोग "नामित" -एक वर्ग के आधार पर केवल एक ही नामित प्रारंभकर्ता होना चाहिए। लेकिन दस्तावेज़ीकरण के अनुसार, कई नामित प्रारंभकर्ता स्वीकार्य हैं।

मान लें कि आपके पास दो (या अधिक) नामित प्रारंभिक प्रारंभकर्ता हैं, उनकी भूमिका उचित ऑब्जेक्ट प्रारंभिकरण की गारंटी के लिए सुपरक्लास के नामित प्रारंभकर्ता को कॉल करना है। लेकिन यदि दोनों नामित प्रारंभकर्ता एक ही सुपरक्लास के नामित प्रारंभकर्ता को बुला रहे हैं, तो पहले स्थान पर एक से अधिक की आवश्यकता क्यों थी? क्या कक्षा को अन्य सभी init एकवचन नामित प्रारंभकर्ता के तरीकों को फ़नल करने के लिए पुन: सक्रिय नहीं किया जाना चाहिए?

मैं थोड़ा सा उलझन में हूं कि केस या डिज़ाइन पैटर्न किस नाम का उपयोग कई नामित प्रारंभकर्ताओं के लिए करेगा?

+1

कभी-कभी प्रत्येक प्रारंभकर्ता के पैरामीटर एक ही "नामित" प्रारंभकर्ता में फ़नल करने के लिए बहुत अलग होते हैं। अनुशंसा यह है कि आपके पास कम से कम पैरामीटर वाले प्रारंभकर्ता हैं जो अधिकांश पैरामीटर वाले एकल प्रारंभकर्ता को कॉल करते हैं, लेकिन यह हमेशा समझ में नहीं आता है। – spstanley

+0

यहां तक ​​कि उस मामले में जहां आपकी कक्षा में व्यापक रूप से विभिन्न पैरामीटर के साथ प्रारंभकर्ता हो सकते हैं, क्या सुपरक्लास के नामित प्रारंभकर्ता को कॉल करने के लिए केवल एक प्रारंभकर्ता ही जिम्मेदार नहीं होना चाहिए? क्या कोई अन्य अपने पैरामीटर को समायोजित नहीं करना चाहिए और इसके परिणामस्वरूप आंतरिक रूप से नामित प्रारंभकर्ता को कॉल करना चाहिए? स्पष्टीकरण के लिए – LucasTizma

उत्तर

6

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

एक और उदाहरण एक दस्तावेज़ वर्ग होगा जिसे केवल नई फाइलों के लिए कुछ प्रारंभिक करने की आवश्यकता है और कुछ अन्य प्रारंभिक दस्तावेज केवल खोले जा रहे हैं। इन दोनों प्रारंभकर्ता अपने सुपर कार्यान्वयन को बुलाएंगे, जो बदले में सामान्य प्रारंभ करने के लिए सादे init विधि को कॉल करता है। हालांकि, चूंकि वे किसी अन्य प्रारंभकर्ता को डिफ़ॉल्ट मान के साथ कॉल करने से अधिक करते हैं, इसलिए उन्हें नामित प्रारंभकर्ता माना जाता है।

+0

धन्यवाद। – LucasTizma

+4

एक अच्छा उदाहरण है 'UIView'' initWithFrame: 'और' initWithCoder: '। यदि आप प्रोग्रामेटिक रूप से इसे तुरंत चालू कर रहे हैं, तो आप पूर्व चाहते हैं। यदि आप बाद में संग्रह से लोड हो रहे हैं। उप-वर्गों में उन स्थितियों में से एक (या समकक्ष = कुछ जो उन लोगों में से एक को बुलाएगा) उचित परिस्थितियों में शामिल होना चाहिए। – bshirley

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