मुझे समझ में आया कि वर्चुअल और ओवरराइड का उपयोग किया जाता है (मुझे इतनी देर तक उपयोग नहीं मिल रहा है)। अब मैं फैक्टरी पैटर्न में उनका उपयोग कर रहा हूं। तो मेरा सवाल यह है कि वर्चुअल और ओवरराइड दृश्य के पीछे क्या करता है? मैं आईएल और मशीन कोड सामान में जाने के लिए तैयार हूं।वर्चुअल और ओवरराइड दृश्य के पीछे क्या करता है
उत्तर
मैं आपको आईएल में यह कैसे किया जाता है, इस बारे में कोई अंतर्दृष्टि नहीं दे सकता लेकिन बुनियादी सिद्धांत सरल है।
जब संकलक बजाय वर्ग के लिए विधि संलग्न की, एक आभासी विधि घोषणा देखता है, यह यह क्या है कि वर्ग है, जो कार्यों के लिए संकेत धारण के लिए एक vtable
(एक आभासी विधि टेबल) कहा जाता है करने के लिए कहते हैं ।
अब के बाद से vtable
वर्ग का एक हिस्सा है, यह अपने उपवर्गों द्वारा विरासत में मिली है और इस प्रकार आभासी तरीके के रूप में अच्छी तरह से लिए गए हैं। अब ओवरराइड बिट आता है। जब संकलक को को एक विधि घोषणा में ओवरराइड करता है, तो यह vtable
देखता है, फ़ंक्शन पॉइंटर को ओवरराइड और बदलने की विधि पाता है ताकि यह नई परिभाषा को इंगित कर सके।
इस प्रकार, आप माता-पिता वर्गों और बाल कक्षाओं में अपनी परिभाषाओं को बदलने की क्षमता दोनों के तरीकों का विरासत प्राप्त करते हैं।
अधिक जानकारी के लिए, Virtual Method Table पर विकिपीडिया लेख देखें।
आपको आईएल - virtual
और override
में जाने की आवश्यकता नहीं है, जिसे polymorphism के नाम से जाना जाने वाला एक प्रसिद्ध ऑब्जेक्ट ओरिएंटेशन अवधारणा शामिल है। प्रभावी रूप से, जब एक बहुलक विधि या संपत्ति का उपयोग किया जाता है, तो कौन सी विधि/संपत्ति वास्तव में लागू होती है केवल रनटाइम पर निर्धारित होती है। बोनेट के तहत, मूल रूप से, सही विधि (किसी संपत्ति के मामले में, यह एक विधि भी है) वर्चुअल विधि तालिका - रनटाइम प्रकार के आधार पर सही विधि खोजने के लिए एक लुकअप तालिका तक पहुंचकर निर्धारित की जाती है।
यदि आप आईएल में रुचि रखते हैं, तो एक संकलित प्रोग्राम (डीएलएल या EXE) देखने के लिए ildasm.exe का उपयोग करें। आप देखेंगे कि जिन तरीकों को आप "आभासी" के रूप में चिह्नित करते हैं उन्हें आईएल में "वर्चुअल" के रूप में चिह्नित किया जाता है।
जादू रनटाइम में होता है। सीएलआर एक "विधि प्रेषण तालिका" (या "आभासी विधि तालिका") बनाता है, जो यह स्मृति में आपकी कक्षा के तरीकों का पता लगाने के लिए उपयोग करता है। पॉलिमॉर्फिज्म को अनुमति देने के लिए, जहां समान विधि नाम रनटाइम प्रकार के आधार पर अलग-अलग चीजों का अर्थ है, वर्चुअल विधियों के लिए कुछ अतिरिक्त लुकअप की आवश्यकता होती है। (एक कह सकते हैं कि वे कर रहे हैं कहा जाता है "आभासी" तरीकों ठीक है क्योंकि वे "आधार पर" चुने गए हैं की वे क्या — पर काम कर रहे हैं लेकिन @ पावेल की टिप्पणी देखें।) Joe Duffy यह इस तरह से रख:
एक आभासी विधि कॉल बहुत अधिक एक साधारण कॉल की तरह है, सिवाय इसके कि को 'इस' ऑब्जेक्ट के आधार पर रनटाइम पर कॉल का लक्ष्य देखना चाहिए।
वे मूल बातें हैं। यदि आप वास्तव में इसके साथ आगे बढ़ना चाहते हैं तो डॉन बॉक्स अच्छी पढ़ाई है।
यह 'आभासी' का एक दिलचस्प व्युत्पत्ति है, लेकिन अगर मैं एक पूर्वदर्शी स्पष्टीकरण (जैसे वीबी की 'मंद' को इन दिनों कुछ दिनों में 'स्मृति में घोषित' के रूप में समझाया जा रहा है, तो मैं उत्सुक होगा - मूल रूप से यह 'डीआईएमशन' से था, और केवल सरणी के लिए उपयोग किया जाता है), या असली चीज़; और यदि उत्तरार्द्ध, क्या आपके पास कोई संदर्भ है? मुझे पता है कि इस सटीक अर्थ में 'आभासी' पहली बार पहली ओओ भाषा, सिमुला-67 में दिखाई दिया था। लेकिन मुझे उस भाषा संदर्भ में कीवर्ड के स्पष्टीकरण को याद नहीं है ... –
ठीक है, तो मैं वहां एक अंग पर बाहर जा रहा हूं ... लेकिन मुझे बहुत सुरक्षित लगता है। घोषणा-इन-मेमोरी मुझ पर एक नया है - मुझे केवल पुराने सरणी-आयाम वाले कीवर्ड के रूप में पता था। वैसे भी, एक साथी linguaphile से सुनकर खुशी हुई। – harpo
मेरा मानना है कि मुझे यह मिला है। "आभासी" "आभासी मात्रा" के लिए एक लघुरूप है; और कारण यह है कि उन्होंने इसे इस तरह से बुलाया था कि उन्होंने मुख्य रूप से विशेषताओं के लिए उपयोग किए जाने वाले तंत्र की कल्पना की है। Http://books.google.com/books?id=6f-8ZhMO3ScC&lpg=PA104&ots=EDFoUJSTBK&dq=simula%20%22virtual%20quantity%22&pg=PA105#v=onepage&q=virtual&f=false –
- 1. INotifyPropertyChanged: दृश्य के पीछे क्या होता है?
- 2. सी # वर्चुअल और ओवरराइड कीवर्ड
- 3. सी # वर्चुअल और ओवरराइड के आंतरिक कार्य
- 4. वर्चस्क्रिप्ट में वर्चुअल कीवर्ड क्या करता है?
- 5. क्या वर्चुअल फ़ंक्शन बेस क्लास में एक ही नाम के गैर-वर्चुअल फ़ंक्शन को ओवरराइड करता है?
- 6. क्यों मेरी वर्चुअल विधि ओवरराइड नहीं है?
- 7. क्या 'ओवरराइड' कीवर्ड सिर्फ ओवरराइड वर्चुअल विधि के लिए एक चेक है?
- 8. क्या गैर-वर्चुअल विधि को ओवरराइड करना संभव है?
- 9. एएसपी.नेट एमवीसी दृश्य - क्या मैं कोड-पीछे
- 10. क्या स्केलैट्रा दृश्यों के पीछे circumflex का उपयोग करता है?
- 11. दृश्य के पीछे दो से int रूपांतरण?
- 12. किसी अन्य दृश्य के पीछे एक दृश्य पर स्पर्श करें?
- 13. ओवरराइड और गैर ओवरराइड निर्माता
- 14. क्वांटिफ़ायर के साथ समस्या और पीछे-पीछे
- 15. LINQ में ऑर्डरबी कैसे काम करता है (दृश्यों के पीछे)?
- 16. वर्चुअल वर्चुअल वर्चुअल वर्चुअल में बदलें और बाइनरी संगत
- 17. आर। जावा के पीछे अवधारणा क्या है?
- 18. लाइटस्ट्रीमर के पीछे जादू क्या है?
- 19. क्या() Object.clone पीछे कारण
- 20. प्रतिलिपि बनाने और प्रत्यक्ष प्रारंभिकता के पीछे क्या प्रेरणा है?
- 21. नींद के पीछे एल्गोरिदम क्या है()?
- 22. CAReplicatorLayer के पीछे जादू क्या है?
- 23. एक्सएसएस के पीछे सामान्य अवधारणा क्या है?
- 24. इसका क्या अर्थ है जब "वर्चुअल" "वर्चुअल शून्य फोब()" के विपरीत "वर्चुअल" क्लास फू: पब्लिक वर्चुअल बार "में है?
- 25. क्या web.config फ़ाइल सेटिंग्स आईआईएस सेटिंग्स ओवरराइड करता है?
- 26. निबर्ननेट और वर्चुअल क्लास गुण?
- 27. हेडर के पीछे तर्क क्या है?
- 28. ज़िप संपीड़न के पीछे अवधारणा क्या है?
- 29. क्या सुपर क्लास ओवरराइड विधि को कॉल नहीं करता है?
- 30. वर्चुअल
अच्छी व्याख्या! – Chris
क्या यह हो सकता है कि vtable में वह विधि वास्तव में ओवरराइड की बजाय जंजीर हो? मैं वास्तव में लक्ष्य कर रहा हूं कि ओवरराइड विधि से हम बेस के साथ ओवरराइड विधि को कॉल कर सकते हैं। –
मुझे लगता है कि श्रृंखला विरासत द्वारा निहित है। जब आप मूल विधि को कॉल करते हैं, तो आप वास्तव में बेस क्लास द्वारा परिभाषित वर्चुअल विधि की परिभाषा को देख रहे हैं और उसे कॉल कर रहे हैं। असल में आप बेस क्लास के vtable को देखते हैं और इसका उपयोग करते हैं। यही कारण है कि आपको इसे आधार का उपयोग करके कॉल करने की आवश्यकता है, ताकि संकलक जानता है कि कहां देखना है। – paracycle