2012-03-07 3 views
15

टेम्पलेट विधि पैटर्न पर चार के गिरोह से:गोफ ने सी ++ टेम्पलेट विधि पैटर्न कार्यान्वयन में संरक्षित (निजी के विपरीत) आभासी तरीकों का उपयोग क्यों करने की सलाह दी है?

  1. सी ++ अभिगम नियंत्रण का उपयोग:

    तीन कार्यान्वयन मुद्दों ध्यान देने योग्य हैं। सी ++ में, आदिम संचालन जो एक टेम्पलेट विधि कॉल संरक्षित सदस्यों को घोषित किया जा सकता है। यह सुनिश्चित करता है कि उन्हें केवल टेम्पलेट विधि द्वारा ही बुलाया जाता है। आदिम परिचालन जिसे ओवरराइड किया जाना चाहिए शुद्ध आभासी घोषित किया जाता है। टेम्पलेट विधि स्वयं को ओवरराइड नहीं किया जाना चाहिए; इसलिए आप टेम्पलेट विधि को एक गैर-वर्चुअल सदस्य फ़ंक्शन बना सकते हैं।

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

देखें हर्ब Sutter से "Virtuality":

http://www.gotw.ca/publications/mill18.htm

वह कहाँ कहा गया है कि:

दिशानिर्देश # 2: आभासी कार्यों निजी बनाने के लिए पसंद करते हैं। दिशानिर्देश # 3: केवल अगर व्युत्पन्न कक्षाओं को वर्चुअल फ़ंक्शन के मूल कार्यान्वयन का आह्वान करने की आवश्यकता है, तो वर्चुअल फ़ंक्शन को सुरक्षित रखें।

मैं GOF टेम्पलेट विधि पैटर्न व्युत्पन्न वर्ग आभासी कार्यों के आधार वर्ग कार्यान्वयन आह्वान करने के लिए के लिए के भीतर किसी भी आवश्यकता नहीं दिख रहा है, तो क्यों चार के गिरोह इन कार्यों निजी के बजाय संरक्षित बनाने की सिफारिश करते हैं?

उत्तर

11

जवाब बहुत सरल है:

Design Patterns dates from 1994। इस समय सी ++ उस भाषा में भारी रूप से विकसित हो रहा था जिसे हम आज जानते हैं - पिछले मानक को 1 99 8 में अंतिम रूप दिया गया था! कंपाइलर्स छोटी गाड़ी थे और उन महत्वपूर्ण विशेषताओं का समर्थन नहीं करते जिन्हें हम अब मानते हैं।

लेकिन अधिक महत्वपूर्ण बात यह है कि कई चीजें नहीं खोजी गईं (विशेष रूप से मुख्यधारा के प्रोग्रामर द्वारा)। टेम्पलेट मेटाप्रोग्रामिंग लें, जिसमें से केवल around the same time पर "ठोकर खाई" थी।

मुझे अत्यधिक संदेह है कि निजी वर्चुअल फ़ंक्शंस के लिए यह भी सच है: गोफ को यह पता नहीं था कि यह कानूनी सी ++ था। या यदि यह था, तो उसने खुद को एक सम्मेलन के रूप में स्थापित नहीं किया था।

वास्तव में, अधिकांश सी ++ कोड जिसे 1 99 4 में "अच्छा" माना जाता था, को सी ++ 11 खाते के बिना भी अत्यधिक जटिल और त्रुटि प्रवण माना जाएगा।

+3

ऐतिहासिक परिप्रेक्ष्य कम या ज्यादा सही है --- 1 99 5 में, मुझे नहीं लगता कि यह अधिकांश सी ++ प्रोग्रामर को भी हुआ है कि आप एक निजी समारोह को ओवरराइड कर सकते हैं।(और 'std :: streambuf' में वर्चुअल फ़ंक्शंस सुरक्षित नहीं हैं, निजी नहीं हैं।) फिर भी, आज भी, मुझे लगता है कि ऐसे कुछ लोग हैं जो ऐसे कार्यों के लिए' निजी 'की बजाय' संरक्षित 'पसंद करते हैं। वे निश्चित रूप से व्युत्पन्न वर्ग के लिए जाना जाना चाहिए, और उन लोगों के लिए, 'निजी' का मतलब निजी, कम से कम मानव पाठकों के लिए है, यदि संकलक नहीं है। –

+1

@ जेम्स मैं उस पर प्रमाणित कर सकता हूं ... हाल ही में जब तक मुझे पता नहीं था कि यह कानूनी था, और इसे पहले बेहद अनूठा पाया गया ... –

+0

धन्यवाद। मुझे संदेह था कि यह जवाब था, लेकिन मेरे पास स्टीफन डेहर्स्ट के सी ++ कॉमन नॉलेज (2005) को सवाल पूछने से पहले हाथ मिला था और उसने मेरा संदेह उठाया कि संरक्षित/निजी तर्क के लिए कुछ और था जो मैं याद कर रहा था। टेम्पलेट विधि पर इसका अध्याय उल्लेख करता है कि यह संरक्षित आभासी कार्यों को कॉल करने के लिए "आम तौर पर" लागू किया गया है, जो कोड उदाहरण में उपयोग करने के लिए चला जाता है। यह अन्यथा टेम्पलेट विधि द्वारा बुलाए जाने वाले आदिम कार्यों के लिए निजी बनाम संरक्षित मुद्दे का कोई उल्लेख नहीं करता है। –

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