टेम्पलेट विधि पैटर्न पर चार के गिरोह से:गोफ ने सी ++ टेम्पलेट विधि पैटर्न कार्यान्वयन में संरक्षित (निजी के विपरीत) आभासी तरीकों का उपयोग क्यों करने की सलाह दी है?
- सी ++ अभिगम नियंत्रण का उपयोग:
तीन कार्यान्वयन मुद्दों ध्यान देने योग्य हैं। सी ++ में, आदिम संचालन जो एक टेम्पलेट विधि कॉल संरक्षित सदस्यों को घोषित किया जा सकता है। यह सुनिश्चित करता है कि उन्हें केवल टेम्पलेट विधि द्वारा ही बुलाया जाता है। आदिम परिचालन जिसे ओवरराइड किया जाना चाहिए शुद्ध आभासी घोषित किया जाता है। टेम्पलेट विधि स्वयं को ओवरराइड नहीं किया जाना चाहिए; इसलिए आप टेम्पलेट विधि को एक गैर-वर्चुअल सदस्य फ़ंक्शन बना सकते हैं।
"यह सुनिश्चित करता है कि उन्हें केवल टेम्पलेट विधि द्वारा बुलाया जाता है।" सच नहीं है, है ना? प्राचीन तरीकों के रूप में (उदाहरण के लिए कुछ शुद्ध आभासी के बजाय आभासी हैं) को व्युत्पन्न वर्ग से भी बुलाया जा सकता है। क्या यह सच नहीं है कि केवल प्राचीन तरीकों को निजी घोषित करने से यह सुनिश्चित होता है कि उन्हें केवल टेम्पलेट विधि द्वारा ही बुलाया जाता है? निजी वर्चुअल आदिम विधियों को फिर भी सुपरक्लास में टेम्पलेट विधि में परिभाषित एल्गोरिदम के भीतर आवश्यक विशेष व्यवहार प्रदान करने के लिए उप-वर्गों में लागू (या पुन: कार्यान्वित) किया जा सकता है।
देखें हर्ब Sutter से "Virtuality":
http://www.gotw.ca/publications/mill18.htm
वह कहाँ कहा गया है कि:
दिशानिर्देश # 2: आभासी कार्यों निजी बनाने के लिए पसंद करते हैं। दिशानिर्देश # 3: केवल अगर व्युत्पन्न कक्षाओं को वर्चुअल फ़ंक्शन के मूल कार्यान्वयन का आह्वान करने की आवश्यकता है, तो वर्चुअल फ़ंक्शन को सुरक्षित रखें।
मैं GOF टेम्पलेट विधि पैटर्न व्युत्पन्न वर्ग आभासी कार्यों के आधार वर्ग कार्यान्वयन आह्वान करने के लिए के लिए के भीतर किसी भी आवश्यकता नहीं दिख रहा है, तो क्यों चार के गिरोह इन कार्यों निजी के बजाय संरक्षित बनाने की सिफारिश करते हैं?
ऐतिहासिक परिप्रेक्ष्य कम या ज्यादा सही है --- 1 99 5 में, मुझे नहीं लगता कि यह अधिकांश सी ++ प्रोग्रामर को भी हुआ है कि आप एक निजी समारोह को ओवरराइड कर सकते हैं।(और 'std :: streambuf' में वर्चुअल फ़ंक्शंस सुरक्षित नहीं हैं, निजी नहीं हैं।) फिर भी, आज भी, मुझे लगता है कि ऐसे कुछ लोग हैं जो ऐसे कार्यों के लिए' निजी 'की बजाय' संरक्षित 'पसंद करते हैं। वे निश्चित रूप से व्युत्पन्न वर्ग के लिए जाना जाना चाहिए, और उन लोगों के लिए, 'निजी' का मतलब निजी, कम से कम मानव पाठकों के लिए है, यदि संकलक नहीं है। –
@ जेम्स मैं उस पर प्रमाणित कर सकता हूं ... हाल ही में जब तक मुझे पता नहीं था कि यह कानूनी था, और इसे पहले बेहद अनूठा पाया गया ... –
धन्यवाद। मुझे संदेह था कि यह जवाब था, लेकिन मेरे पास स्टीफन डेहर्स्ट के सी ++ कॉमन नॉलेज (2005) को सवाल पूछने से पहले हाथ मिला था और उसने मेरा संदेह उठाया कि संरक्षित/निजी तर्क के लिए कुछ और था जो मैं याद कर रहा था। टेम्पलेट विधि पर इसका अध्याय उल्लेख करता है कि यह संरक्षित आभासी कार्यों को कॉल करने के लिए "आम तौर पर" लागू किया गया है, जो कोड उदाहरण में उपयोग करने के लिए चला जाता है। यह अन्यथा टेम्पलेट विधि द्वारा बुलाए जाने वाले आदिम कार्यों के लिए निजी बनाम संरक्षित मुद्दे का कोई उल्लेख नहीं करता है। –