2012-12-21 35 views
6

विकिपीडिया एक विरोधी पैटर्न के रूप में "कॉल सुपर" वर्गीकृत करता है, और मैं वास्तव में क्यों नहीं समझता। पैटर्न का उद्देश्य अक्सर उद्देश्य-सी/कोको में किया जाता है; उदाहरण के लिए init/dealloc, सही, awakefromnib सभी को सुपर कॉल करने की आवश्यकता है। क्या मैं यहां अवधारणा को गलत समझ रहा हूं? लेख के लिएविकिपीडिया के अनुसार "कॉल सुपर" को एंटी-पैटर्न क्यों माना जाता है?

लिंक: http://en.wikipedia.org/wiki/Call_super

+0

क्या आप स्रोत प्रदान कर सकते हैं? कॉलिंग सुपर ऑब्जेक्ट उन्मुख प्रोग्रामिंग का एक हिस्सा है, मुझे नहीं पता कि यह एक विरोधी पैटर्न क्यों होना चाहिए .. – NSAddict

+0

संबंधित विकिपीडिया लेख से लिंक करें? (याद रखें विकिपीडिया को सहयोगी रूप से संपादित किया गया है, वे _could_ गलत हो)। – driis

+0

यह वास्तव में दुखी है कि यह प्रश्न "रचनात्मक नहीं" के रूप में चिह्नित है। मैंने इसे बहुत महत्वपूर्ण पाया – Kuba

उत्तर

13

यह the article, में कहते हैं यह आवश्यकता सुपर विधि antipattern है कि, सुपर वर्ग यानी कॉल करने के लिए है कि आप बनाने के लिए विधि ओवरराइड करने के लिए "उम्मीद" कार्यक्षमता पूर्ण - लेकिन यह इस उम्मीद को स्पष्ट किए बिना ऐसा करता है। और यह भी आपको सुपर कार्यान्वयन कॉल करने की उम्मीद है। कार्यक्रम के लिए दोनों काम करने के लिए आवश्यक हैं।

यह एक एंटीपार्टर्न है, क्योंकि प्रोग्रामर के इरादे कोड से नहीं लिया जा सकता है। यदि आपके सहकर्मियों ने इस पर काम करने का फैसला किया है, तो वे नहीं जान पाएंगे कि कक्षा को आप क्या करने की उम्मीद करते हैं, और इसलिए उन्हें समस्याएं और/या परेशानियों का सामना करना पड़ सकता है।

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

उद्देश्य-सी में सार या वर्चुअल विधियां नहीं हैं, लेकिन यदि आप सुपर विधि कहलाते हैं तो आप स्पष्ट रूप से अपवाद उठाकर उसी प्रभाव को प्राप्त कर सकते हैं। इस तरह, यदि आपके सहकर्मी विधि को ओवरराइड करना भूल जाते हैं, तो प्रोग्राम क्रैश हो जाएगा - और यह एक त्रुटि संदेश के साथ दुर्घटनाग्रस्त हो जाएगा जो वे समझेंगे, और इससे उन्हें समस्या को समझने और ठीक करने में सक्षम किया जाएगा, कुछ अनियमित कार्यक्षमता पूर्ण होने के कारण, कोई स्पष्टीकरण के साथ व्यवहार।

+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन क्या उद्देश्य-सी में टेम्पलेट्स हैं? –

+0

लेकिन ओपी क्या पूछ रहा है वह नहीं है। –

+0

वह पूछ रहा है कि क्यों सुपर सुपर एक विरोधी पैटर्न है, सही है। मैंने जवाब दिया, है ना? – weltraumpirat

3

समस्या का सार है:

..However, तथ्य यह है कि अपने आप में भाषा करने में सक्षम नहीं हो सकता है सभी शर्तों इस फोन पर निर्धारित क्या यह एक विरोधी पैटर्न बनाता है लागू।

तो लेखक प्रोग्रामर के बारे में कुछ ऐसा करने के बारे में गुदा हैं जो उन्हें विश्वास है कि भाषा उनके लिए क्या करनी चाहिए।

समाधान wikepedia लेख Call Super में उल्लेख किया है:

इन मुद्दों को हल करने के लिए एक बेहतर दृष्टिकोण टेम्पलेट विधि पैटर्न, जहां सुपर क्लास एक विशुद्ध सार विधि कि लागू किया जाना चाहिए शामिल हैं का उपयोग करने के बजाय है उपवर्गों से और मूल विधि है कि विधि

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

+0

तो एक टेम्पलेट पैटर्न सुपर को कॉल करने से बेहतर क्यों माना जाता है? – eyebrowsoffire

+0

@eyebrowsoffire मेरा संपादन देखें –

+1

@ जबकि पीटर कहने में सही है कि कोई वर्चुअल फ़ंक्शंस नहीं है, यह समान अर्थशास्त्र का उत्पादन करना आसान है (उदाहरण के लिए उत्तर देखें http://stackoverflow.com/questions/13793864/abstract-class-for-objective- c/13797335 # 13797335)। तो यदि आप चाहते हैं कि आप टेम्पलेट पैटर्न को कार्यान्वित कर सकें। – CRD