यह एक मिनी-सीरीज़ है जो ओवरलोड्स, शैडोज़ और ओवरराइड्स में अंतर को कवर करती है VB.NET. यह लेख ओवरराइड को कवर करता है। दूसरों को कवर करने वाले लेख यहाँ हैं:
-> अधिभार
-> छाया
ये तकनीक बेहद भ्रामक हो सकता है; इन खोजशब्दों और अंतर्निहित वंशानुक्रम विकल्पों के संयोजन बहुत सारे हैं। Microsoft के स्वयं के दस्तावेज़ विषय न्याय करना शुरू नहीं करते हैं और बहुत बुरा है, या वेब पर पुरानी जानकारी है। यह सुनिश्चित करने के लिए सबसे अच्छी सलाह है कि आपके कार्यक्रम को सही ढंग से कोडित किया गया है, "परीक्षण, परीक्षण और फिर से परीक्षण करें।" इस श्रृंखला में, हम उन पर एक बार एक नज़र डालेंगे, जिसमें मतभेदों पर जोर दिया जाएगा।
ओवरराइड
शैडो, ओवरलोड्स और ओवरराइड्स जो चीज सभी में समान है, वह यह है कि वे बदलते समय तत्वों के नाम का पुन: उपयोग करते हैं। छाया और अधिभार दोनों एक ही कक्षा के भीतर या जब ए कक्षा विरासत में मिली एक और वर्ग। हालांकि, ओवरराइड्स का उपयोग केवल व्युत्पन्न वर्ग (कभी-कभी एक चाइल्ड क्लास कहा जाता है) में किया जा सकता है जो एक से विरासत में मिला है आधार वर्ग (कभी-कभी एक मूल वर्ग कहा जाता है)। और ओवरराइड्स हथौड़ा है; यह आपको आधार वर्ग से पूरी तरह से एक विधि (या संपत्ति) को बदलने देता है।
कक्षाओं और छाया कीवर्ड के बारे में लेख में (देखें: VB.NET में छाया), एक फ़ंक्शन को यह दिखाने के लिए जोड़ा गया था कि विरासत में मिली प्रक्रिया को संदर्भित किया जा सकता है।
पब्लिक क्लास प्रोफेशनलकंटैक्ट। '... कोड नहीं दिखाया गया... सार्वजनिक समारोह हैशनाम ( स्ट्रिंग के रूप में ByVal एनएम) स्ट्रिंग के रूप में। वापसी nm। GetHashCode। अंत समारोह। एंड क्लास।
वह कोड जो इस एक (उदाहरण में CodedProfessionalContact) से व्युत्पन्न एक वर्ग को बताता है, जो इस पद्धति को कॉल कर सकता है क्योंकि यह विरासत में मिला है।
उदाहरण में, मैंने VB.NET का उपयोग किया GetHashCode विधि को सरल रखने के लिए विधि और यह काफी बेकार परिणाम लौटा, मान -520086483। मान लीजिए कि मैं एक अलग परिणाम चाहता था बजाय, लेकिन,
-> मैं बेस क्लास नहीं बदल सकता। (हो सकता है कि मेरे पास एक विक्रेता से सभी संकलित कोड हों।)
... तथा ...
-> मैं कॉलिंग कोड नहीं बदल सकता (हो सकता है कि एक हजार प्रतियां हों और मैं उन्हें अपडेट नहीं कर सकता।)
यदि मैं व्युत्पन्न वर्ग को अपडेट कर सकता हूं, तो मैं बदले हुए परिणाम को बदल सकता हूं। (उदाहरण के लिए, कोड एक अद्यतन योग्य DLL का हिस्सा हो सकता है।)
एक समस्या है। क्योंकि यह इतना व्यापक और शक्तिशाली है, आपको ओवरराइड्स का उपयोग करने के लिए बेस क्लास से अनुमति लेनी होगी। लेकिन अच्छी तरह से डिज़ाइन किए गए कोड लाइब्रेरी इसे प्रदान करते हैं। (तुम्हारी कोड पुस्तकालयों को अच्छी तरह से डिजाइन किया गया है, ठीक है?) उदाहरण के लिए, Microsoft ने हमारे द्वारा उपयोग किए गए फ़ंक्शन को ओवरराइड किया है। यहाँ वाक्य रचना का एक उदाहरण दिया गया है।
सार्वजनिक अतिरंजित समारोह GetHashCode पूर्णांक के रूप में
तो उस कीवर्ड को हमारे उदाहरण बेस क्लास में भी मौजूद होना चाहिए।
सार्वजनिक अतिव्यस्त समारोह हैशनाम ( स्ट्रिंग के रूप में ByVal एनएम) स्ट्रिंग के रूप में।
विधि को ओवरराइड करना अब ओवरराइड कीवर्ड के साथ एक नया प्रदान करने के रूप में सरल है। Visual Studio फिर से AutoComplete के साथ आपके लिए कोड भरकर आपको एक रनिंग स्टार्ट देता है। जब तुम आए ...
सार्वजनिक ओवरराइड्स फंक्शन हैशनाम (
विजुअल स्टूडियो स्वचालित रूप से जैसे ही आप प्रारंभिक कोष्ठक लिखते हैं, रिटर्न स्टेटमेंट सहित, जो केवल मूल वर्ग से मूल फ़ंक्शन को कॉल करता है। (यदि आप सिर्फ कुछ जोड़ रहे हैं, तो आमतौर पर आपके नए कोड के वैसे भी निष्पादित होने के बाद यह एक अच्छी बात है।)
सार्वजनिक ओवरराइड्स फंक्शन हैशनाम ( स्ट्रिंग के रूप में एनएम) स्ट्रिंग के रूप में। MyBase पर लौटें। HashTheName (nm) अंत समारोह।
इस मामले में, हालांकि, मैं विधि को कुछ और समान रूप से बेकार करने के लिए प्रतिस्थापित करने जा रहा हूं, यह स्पष्ट करने के लिए कि यह कैसे किया जाता है: VB.NET फ़ंक्शन जो स्ट्रिंग को उलट देगा।
सार्वजनिक ओवरराइड्स फंक्शन हैशनाम ( स्ट्रिंग के रूप में एनएम) स्ट्रिंग के रूप में। Microsoft लौटें। मूल दृश्य। StrReverse (nm) अंत समारोह।
अब कॉलिंग कोड एक पूरी तरह से अलग परिणाम प्राप्त करता है। (छाया के बारे में लेख में परिणाम के साथ तुलना करें।)
संपर्क: 246। बिज़नेसनेम: विलेन डिफ़ेक्ट्स, जीएमबीएच। द हैश ऑफ द बिजनेसनेम: एचबीएमजी, sretaefeD nialliV।
आप संपत्तियों को भी ओवरराइड कर सकते हैं। मान लीजिए कि आपने तय किया है कि 123 से अधिक कॉन्टेक्ट्स वैल्यू की अनुमति नहीं दी जाएगी और 111 पर डिफ़ॉल्ट होना चाहिए। आप संपत्ति को ओवरराइड कर सकते हैं और संपत्ति के सहेजे जाने पर उसे बदल सकते हैं:
निजी _ContactID पूर्णांक के रूप में। सार्वजनिक संपर्क संपत्ति संपर्ककर्ता के रूप में ओवरराइड करता है। प्राप्त। _ContactID लौटें। अंत मिलता है। सेट (पूर्णांक के रूप में मूल्य) यदि मान> 123 तो। _ContactID = 111। अन्य। _ContactID = मान। अगर अंत। अंतिम सेट। अंतिम संपत्ति।
तब आपको यह परिणाम मिलता है जब एक बड़ा मूल्य पास होता है:
संपर्क: 111 बिज़नेसनेम: डामसेल बचाव दल, लि।
वैसे, अब तक के उदाहरण कोड में, पूर्णांक मान नए में दोगुने हैं सबरूटीन (छाया पर लेख देखें), इसलिए 123 का एक पूर्णांक 246 में बदल दिया जाता है और फिर 111 में बदल जाता है।
VB.NET आपको आधार वर्ग में MustOverride और NotOverridable कीवर्ड का उपयोग करके ओवरराइड करने के लिए एक व्युत्पन्न वर्ग की विशेष रूप से आवश्यकता या अस्वीकार करने की अनुमति देकर, आपको और भी अधिक नियंत्रण प्रदान करता है। लेकिन इन दोनों का उपयोग काफी विशिष्ट मामलों में किया जाता है। सबसे पहले, NotOverridable।
चूंकि किसी सार्वजनिक वर्ग के लिए डिफ़ॉल्ट NotOverridable है, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता क्यों है? यदि आप इसे बेस क्लास में HashTheName फ़ंक्शन पर आज़माते हैं, तो आपको एक सिंटैक्स त्रुटि मिलती है, लेकिन त्रुटि संदेश का पाठ आपको एक सुराग देता है:
'NotOverridable' उन विधियों के लिए निर्दिष्ट नहीं किया जा सकता है जो किसी अन्य विधि को ओवरराइड नहीं करती हैं।
ओवरराइड विधि के लिए डिफ़ॉल्ट बस विपरीत है: ओवररिएडेबल। इसलिए यदि आप निश्चित रूप से वहां रुकना चाहते हैं, तो आपको उस विधि पर NotOverridable को निर्दिष्ट करना होगा। हमारे उदाहरण कोड में:
सार्वजनिक ध्यान देने योग्य ओवरराइड HashTheName (...
तब अगर वर्ग CodedProfessionalContact, बदले में, विरासत में मिला है ...
पब्लिक क्लास NotOverridableEx। Inherits CodedProfessionalContact।
... फ़ंक्शन HashTheName को उस वर्ग में ओवरराइड नहीं किया जा सकता है। एक तत्व जिसे ओवरराइड नहीं किया जा सकता है उसे कभी-कभी एक सील तत्व कहा जाता है।
का एक मौलिक हिस्सा ।नेट फाउंडेशन आवश्यकता है कि सभी अनिश्चितता को दूर करने के लिए हर वर्ग के उद्देश्य को स्पष्ट रूप से परिभाषित किया जाए। पिछली ओओपी भाषाओं में एक समस्या को "नाजुक आधार वर्ग" कहा गया है। यह तब होता है जब एक आधार क्लास एक नए नाम को उसी नाम के साथ एक नए नाम के साथ जोड़ता है, जो एक उपवर्ग में एक विधि नाम है जो एक आधार से विरासत में मिला है कक्षा। उपवर्ग लिखने वाले प्रोग्रामर ने बेस क्लास को ओवरराइड करने की योजना नहीं बनाई, लेकिन वास्तव में ऐसा ही होता है। यह घायल प्रोग्रामर के रोने के परिणाम के लिए जाना जाता है, "मैंने कुछ भी नहीं बदला, लेकिन मेरा कार्यक्रम दुर्घटनाग्रस्त हो गया वैसे भी। "अगर एक संभावना है कि भविष्य में एक वर्ग को अपडेट किया जाएगा और यह समस्या पैदा होगी, तो इसे घोषित करें NotOverridable।
MustOverride को अक्सर एक सार वर्ग कहा जाता है। (C # में, यही बात कीवर्ड अमूर्त का उपयोग करती है!) यह एक ऐसा वर्ग है जो सिर्फ एक टेम्पलेट प्रदान करता है और आपसे यह अपेक्षा की जाती है कि आप इसे अपने कोड से भरें। Microsoft इसका उदाहरण देता है:
पब्लिक मस्टेरहिट क्लास वाशमैचाइन। उप नया () 'क्लास को तत्काल करने के लिए कोड यहाँ जाता है। अंत उप। सार्वजनिक MustOverride सब वॉश। सार्वजनिक MustOverride उप कुल्ला (पूर्णांक के रूप में लोड करें) सार्वजनिक MustOverride फ़ंक्शन स्पिन (इंटेगर के रूप में गति) लंबे समय तक। एंड क्लास।
Microsoft के उदाहरण को जारी रखने के लिए, वाशिंग मशीन इन चीजों (वॉश, रिंस और स्पिन) को काफी अलग तरीके से करेगी, इसलिए बेस क्लास में फ़ंक्शन को परिभाषित करने का कोई फायदा नहीं है। लेकिन यह सुनिश्चित करने में एक फायदा है कि किसी भी वर्ग को यह विरासत में मिला है कर देता है उन्हें परिभाषित करें। समाधान: एक अमूर्त वर्ग।
यदि आपको ओवरलोड और ओवरराइड के बीच अंतर के बारे में और भी अधिक स्पष्टीकरण की आवश्यकता है, तो एक त्वरित टिप में एक पूरी तरह से अलग उदाहरण विकसित किया गया है: ओवरलोड वर्सेस ओवरराइड्स
VB.NET आपको बेस क्लास में MustOverride और NotOverridable कीवर्ड का उपयोग करके ओवरराइड करने के लिए एक व्युत्पन्न वर्ग की विशेष रूप से आवश्यकता या अस्वीकार करने की अनुमति देकर आपको और भी अधिक नियंत्रण प्रदान करता है। लेकिन इन दोनों का उपयोग काफी विशिष्ट मामलों में किया जाता है। सबसे पहले, NotOverridable।
चूंकि किसी सार्वजनिक वर्ग के लिए डिफ़ॉल्ट NotOverridable है, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता क्यों है? यदि आप इसे बेस क्लास में HashTheName फ़ंक्शन पर आज़माते हैं, तो आपको एक सिंटैक्स त्रुटि मिलती है, लेकिन त्रुटि संदेश का पाठ आपको एक सुराग देता है:
'NotOverridable' उन विधियों के लिए निर्दिष्ट नहीं किया जा सकता है जो किसी अन्य विधि को ओवरराइड नहीं करती हैं।
ओवरराइड विधि के लिए डिफ़ॉल्ट बस विपरीत है: ओवररिएडेबल। इसलिए यदि आप निश्चित रूप से वहां रुकना चाहते हैं, तो आपको उस विधि पर NotOverridable को निर्दिष्ट करना होगा। हमारे उदाहरण कोड में:
सार्वजनिक ध्यान देने योग्य ओवरराइड HashTheName (...
तब अगर वर्ग CodedProfessionalContact, बदले में, विरासत में मिला है ...
पब्लिक क्लास NotOverridableEx। Inherits CodedProfessionalContact।
... फ़ंक्शन HashTheName को उस वर्ग में ओवरराइड नहीं किया जा सकता है। एक तत्व जिसे ओवरराइड नहीं किया जा सकता है उसे कभी-कभी एक सील तत्व कहा जाता है।
.NET फाउंडेशन का एक बुनियादी हिस्सा यह है कि हर अनिश्चितता को दूर करने के लिए हर वर्ग के उद्देश्य को स्पष्ट रूप से परिभाषित किया जाए। पिछली ओओपी भाषाओं में एक समस्या को "नाजुक आधार वर्ग" कहा गया है। यह तब होता है जब एक आधार क्लास एक नए नाम को उसी नाम के साथ एक नए नाम के साथ जोड़ता है, जो एक उपवर्ग में एक विधि नाम है जो एक आधार से विरासत में मिला है कक्षा। उपवर्ग लिखने वाले प्रोग्रामर ने बेस क्लास को ओवरराइड करने की योजना नहीं बनाई, लेकिन वास्तव में ऐसा ही होता है। यह घायल प्रोग्रामर के रोने के परिणाम के लिए जाना जाता है, "मैंने कुछ भी नहीं बदला, लेकिन मेरा कार्यक्रम दुर्घटनाग्रस्त हो गया वैसे भी। "अगर एक संभावना है कि भविष्य में एक वर्ग को अपडेट किया जाएगा और यह समस्या पैदा होगी, तो इसे घोषित करें NotOverridable।
MustOverride को अक्सर एक सार वर्ग कहा जाता है। (C # में, यही बात कीवर्ड अमूर्त का उपयोग करती है!) यह एक ऐसा वर्ग है जो सिर्फ एक टेम्पलेट प्रदान करता है और आपसे यह अपेक्षा की जाती है कि आप इसे अपने कोड से भरें। Microsoft इसका उदाहरण देता है:
पब्लिक मस्टेरहिट क्लास वाशमैचाइन। उप नया () 'क्लास को तत्काल करने के लिए कोड यहाँ जाता है। अंत उप। सार्वजनिक MustOverride सब वॉश। सार्वजनिक MustOverride उप कुल्ला (पूर्णांक के रूप में लोड करें) सार्वजनिक MustOverride फ़ंक्शन स्पिन (इंटेगर के रूप में गति) लंबे समय तक। एंड क्लास।
Microsoft के उदाहरण को जारी रखने के लिए, वाशिंग मशीन इन चीजों (वॉश, रिंस और स्पिन) को काफी अलग तरीके से करेगी, इसलिए बेस क्लास में फ़ंक्शन को परिभाषित करने का कोई फायदा नहीं है। लेकिन यह सुनिश्चित करने में एक फायदा है कि किसी भी वर्ग को यह विरासत में मिला है कर देता है उन्हें परिभाषित करें। समाधान: एक अमूर्त वर्ग।
यदि आपको ओवरलोड और ओवरराइड के बीच अंतर के बारे में और भी अधिक स्पष्टीकरण की आवश्यकता है, तो एक त्वरित टिप में एक पूरी तरह से अलग उदाहरण विकसित किया गया है: ओवरलोड वर्सेस ओवरराइड्स