2009-08-21 10 views
7

मुझे समझ में आया कि वर्चुअल और ओवरराइड का उपयोग किया जाता है (मुझे इतनी देर तक उपयोग नहीं मिल रहा है)। अब मैं फैक्टरी पैटर्न में उनका उपयोग कर रहा हूं। तो मेरा सवाल यह है कि वर्चुअल और ओवरराइड दृश्य के पीछे क्या करता है? मैं आईएल और मशीन कोड सामान में जाने के लिए तैयार हूं।वर्चुअल और ओवरराइड दृश्य के पीछे क्या करता है

उत्तर

15

मैं आपको आईएल में यह कैसे किया जाता है, इस बारे में कोई अंतर्दृष्टि नहीं दे सकता लेकिन बुनियादी सिद्धांत सरल है।

जब संकलक बजाय वर्ग के लिए विधि संलग्न की, एक आभासी विधि घोषणा देखता है, यह यह क्या है कि वर्ग है, जो कार्यों के लिए संकेत धारण के लिए एक vtable (एक आभासी विधि टेबल) कहा जाता है करने के लिए कहते हैं ।

अब के बाद से vtable वर्ग का एक हिस्सा है, यह अपने उपवर्गों द्वारा विरासत में मिली है और इस प्रकार आभासी तरीके के रूप में अच्छी तरह से लिए गए हैं। अब ओवरराइड बिट आता है। जब संकलक को को एक विधि घोषणा में ओवरराइड करता है, तो यह vtable देखता है, फ़ंक्शन पॉइंटर को ओवरराइड और बदलने की विधि पाता है ताकि यह नई परिभाषा को इंगित कर सके।

इस प्रकार, आप माता-पिता वर्गों और बाल कक्षाओं में अपनी परिभाषाओं को बदलने की क्षमता दोनों के तरीकों का विरासत प्राप्त करते हैं।

अधिक जानकारी के लिए, Virtual Method Table पर विकिपीडिया लेख देखें।

+1

अच्छी व्याख्या! – Chris

+0

क्या यह हो सकता है कि vtable में वह विधि वास्तव में ओवरराइड की बजाय जंजीर हो? मैं वास्तव में लक्ष्य कर रहा हूं कि ओवरराइड विधि से हम बेस के साथ ओवरराइड विधि को कॉल कर सकते हैं। –

+0

मुझे लगता है कि श्रृंखला विरासत द्वारा निहित है। जब आप मूल विधि को कॉल करते हैं, तो आप वास्तव में बेस क्लास द्वारा परिभाषित वर्चुअल विधि की परिभाषा को देख रहे हैं और उसे कॉल कर रहे हैं। असल में आप बेस क्लास के vtable को देखते हैं और इसका उपयोग करते हैं। यही कारण है कि आपको इसे आधार का उपयोग करके कॉल करने की आवश्यकता है, ताकि संकलक जानता है कि कहां देखना है। – paracycle

4

आपको आईएल - virtual और override में जाने की आवश्यकता नहीं है, जिसे polymorphism के नाम से जाना जाने वाला एक प्रसिद्ध ऑब्जेक्ट ओरिएंटेशन अवधारणा शामिल है। प्रभावी रूप से, जब एक बहुलक विधि या संपत्ति का उपयोग किया जाता है, तो कौन सी विधि/संपत्ति वास्तव में लागू होती है केवल रनटाइम पर निर्धारित होती है। बोनेट के तहत, मूल रूप से, सही विधि (किसी संपत्ति के मामले में, यह एक विधि भी है) वर्चुअल विधि तालिका - रनटाइम प्रकार के आधार पर सही विधि खोजने के लिए एक लुकअप तालिका तक पहुंचकर निर्धारित की जाती है।

4

यदि आप आईएल में रुचि रखते हैं, तो एक संकलित प्रोग्राम (डीएलएल या EXE) देखने के लिए ildasm.exe का उपयोग करें। आप देखेंगे कि जिन तरीकों को आप "आभासी" के रूप में चिह्नित करते हैं उन्हें आईएल में "वर्चुअल" के रूप में चिह्नित किया जाता है।

जादू रनटाइम में होता है। सीएलआर एक "विधि प्रेषण तालिका" (या "आभासी विधि तालिका") बनाता है, जो यह स्मृति में आपकी कक्षा के तरीकों का पता लगाने के लिए उपयोग करता है। पॉलिमॉर्फिज्म को अनुमति देने के लिए, जहां समान विधि नाम रनटाइम प्रकार के आधार पर अलग-अलग चीजों का अर्थ है, वर्चुअल विधियों के लिए कुछ अतिरिक्त लुकअप की आवश्यकता होती है। (एक कह सकते हैं कि वे कर रहे हैं कहा जाता है "आभासी" तरीकों ठीक है क्योंकि वे "आधार पर" चुने गए हैं की वे क्या — पर काम कर रहे हैं लेकिन @ पावेल की टिप्पणी देखें।) Joe Duffy यह इस तरह से रख:

एक आभासी विधि कॉल बहुत अधिक एक साधारण कॉल की तरह है, सिवाय इसके कि को 'इस' ऑब्जेक्ट के आधार पर रनटाइम पर कॉल का लक्ष्य देखना चाहिए।

वे मूल बातें हैं। यदि आप वास्तव में इसके साथ आगे बढ़ना चाहते हैं तो डॉन बॉक्स अच्छी पढ़ाई है।

+0

यह 'आभासी' का एक दिलचस्प व्युत्पत्ति है, लेकिन अगर मैं एक पूर्वदर्शी स्पष्टीकरण (जैसे वीबी की 'मंद' को इन दिनों कुछ दिनों में 'स्मृति में घोषित' के रूप में समझाया जा रहा है, तो मैं उत्सुक होगा - मूल रूप से यह 'डीआईएमशन' से था, और केवल सरणी के लिए उपयोग किया जाता है), या असली चीज़; और यदि उत्तरार्द्ध, क्या आपके पास कोई संदर्भ है? मुझे पता है कि इस सटीक अर्थ में 'आभासी' पहली बार पहली ओओ भाषा, सिमुला-67 में दिखाई दिया था। लेकिन मुझे उस भाषा संदर्भ में कीवर्ड के स्पष्टीकरण को याद नहीं है ... –

+0

ठीक है, तो मैं वहां एक अंग पर बाहर जा रहा हूं ... लेकिन मुझे बहुत सुरक्षित लगता है। घोषणा-इन-मेमोरी मुझ पर एक नया है - मुझे केवल पुराने सरणी-आयाम वाले कीवर्ड के रूप में पता था। वैसे भी, एक साथी linguaphile से सुनकर खुशी हुई। – harpo

+0

मेरा मानना ​​है कि मुझे यह मिला है। "आभासी" "आभासी मात्रा" के लिए एक लघुरूप है; और कारण यह है कि उन्होंने इसे इस तरह से बुलाया था कि उन्होंने मुख्य रूप से विशेषताओं के लिए उपयोग किए जाने वाले तंत्र की कल्पना की है। 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 –

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