2012-10-01 13 views
21

का उपयोग करना है, तो मैं जे गैलोवे द्वारा एक ट्यूटोरियल 'प्रोफेशनल एएसपी.नेट एमवीसी 3' के माध्यम से काम कर रहा हूं। इस ट्यूटोरियल में, जॉन हमें दिखाता है कि एमवीसी संगीत स्टोर कैसे बनाया जाए।सी # - सार्वजनिक int वर्चुअल का उपयोग कब करें, और जब सार्वजनिक int

मैं उस हिस्से में हूं जहां हम पहले ईएफ कोड का उपयोग कर डेटा मॉडल करने के लिए सीएस कक्षाएं बना रहे हैं।

I सभी पुस्तक में उदाहरण, public virtual int property {get; set; } कोई स्पष्टीकरण के साथ प्रयोग किया जाता है। आभासी शब्द हर जगह भरा हुआ है।

वेब पर कहीं और, मैंने वर्चुअल शब्द को किसी भी प्रकार की संगतता के साथ उपयोग नहीं किया है।

किसी को भी मेरे लिए समझा सकते हैं:

  1. इस विशेष संदर्भ
  2. में शब्द 'आभासी' के प्रयोजन का उपयोग कर रहा है 'आभासी' आवश्यक?
  3. कुछ लोग 'वर्चुअल' का उपयोग क्यों करते हैं और अन्य नहीं करते हैं?
  4. विदेशी कुंजी परिभाषित करते समय कुछ लोग केवल 'वर्चुअल' का उपयोग क्यों करते हैं?
  5. 'आभासी' शब्द का सबसे अच्छा अभ्यास उपयोग क्या है?

अग्रिम

+0

के संभावित डुप्लिकेट [आभासी कार्यों] (http://stackoverflow.com/questions/6520394/virtual-functions) और http://stackoverflow.com/questions/1062102/practical-usage-of-virtual -फंक्शन-इन-सी-तेज – dash

+0

पता नहीं था कि वर्चुअल फ़ंक्शन और आभासी गुण एक और एक ही चीज़ थे ??? – Gravy

+1

यह 'वर्चुअल' कीवर्ड है जो महत्वपूर्ण है :-) चाहे वह कोई फ़ंक्शन या प्रॉपर्टी है, भले ही इसे वर्चुअल के रूप में चिह्नित न किया जाए, तब तक जब तक कोई वंशज 'नए' कीवर्ड का उपयोग नहीं करता है, तो उन्हें कार्यान्वयन को लेना होगा जैसा कि परिभाषित किया गया है आधार वर्ग कल्पना कीजिए कि आपके पास "नाम" नामक संपत्ति के साथ व्यक्ति नामक एक वर्ग थी। यदि आपने इसे वर्चुअल प्रॉपर्टी के रूप में चिह्नित नहीं किया है, तो व्यक्ति के सभी वंशज डिफ़ॉल्ट रूप से उस संपत्ति को उनके नाम के रूप में प्राप्त करेंगे। यदि आप इसे वर्चुअल (या नए कीवर्ड का उपयोग करते हैं) बनाते हैं तो आप अधिक विशिष्ट के साथ कार्यान्वयन (या, नए मामले में, प्रतिस्थापित कर सकते हैं) को ओवरराइड कर सकते हैं। – dash

उत्तर

10

में बहुत धन्यवाद आदेश को सही मायने में virtual कीवर्ड आप Polymorphism in general पर पढ़ना चाहते करने जा रहे हैं समझने के लिए:

बहुरूपता अक्सर के तीसरे स्तंभ के रूप में जाना जाता है ऑब्जेक्ट उन्मुख प्रोग्रामिंग, encapsulation और विरासत के बाद। बहुरूपता एक ग्रीक शब्द का अर्थ है कि "कई के आकार का" है और यह दो अलग पहलुओं है:

  1. रन समय, एक व्युत्पन्न वर्ग की वस्तुओं स्थानों ऐसे में एक आधार वर्ग की वस्तुओं के रूप में इलाज किया जा सकता विधि पैरामीटर और संग्रह या सरणी के रूप में। जब ऐसा होता है, ऑब्जेक्ट का घोषित प्रकार अब अपने रन-टाइम प्रकार के समान नहीं है।

  2. बेस वर्गों को परिभाषित कर सकते हैं और आभासी तरीकों को लागू करने, और कक्षाएं ली गई उन्हें ओवरराइड कर सकते हैं, जिसका मतलब है वे अपने स्वयं के परिभाषा और कार्यान्वयन प्रदान करते हैं। रन-टाइम पर, जब क्लाइंट कोड विधि को कॉल करता है, तो सीएलआर ऑब्जेक्ट के रन-टाइम प्रकार को देखता है, और वर्चुअल विधि के ओवरराइड को आमंत्रित करता है। इस प्रकार आपके स्रोत कोड में आप बेस क्लास पर एक विधि कॉल कर सकते हैं, और का व्युत्पन्न वर्ग का संस्करण निष्पादित करने का तरीका बना सकता है।

एक बार जब आप इन अवधारणाओं को बेहतर ढंग से समझने आप या नहीं, विधि आप किताब से पैदा कर रहे virtual या नहीं होने की जरूरत है निर्धारित करने में सक्षम हो सकता है।

0
डॉक्स

आभासी एक प्रणाली, संपत्ति, इंडेक्सर या घटना घोषणा में संशोधन करें और एक व्युत्पन्न वर्ग में ओवरराइड करने के लिए अनुमति देने के लिए प्रयोग किया जाता है से

तो यदि आपको पुरानी कार्यक्षमता को छिपाने की आवश्यकता है और नया जोड़ना है तो आप वर्चुअल का उपयोग कर सकते हैं। विभिन्न अनुप्रयोगों के नए मॉड्यूल और वास्तुकला का विकास पर अनुसार अंतर requrementce जरूरत है ..

यहाँ http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

1

देख virtual (C# Reference) देखें। virtual कीवर्ड जोड़ना संपत्ति को व्युत्पन्न कक्षाओं में ओवरराइड करने की अनुमति देता है, जो कि जब आप एक एमवीसी ऐप के सामान्यीकृत बेस क्लास बना रहे हैं तो बहुत संभावना है।

4

ठीक है, इसलिए वर्चुअल शब्द, मूल रूप से "अतिसंवेदनशील" (आधार कार्यान्वयन) है, लेकिन सार नहीं है (जिसका अर्थ मूल कार्यान्वयन नहीं है)।

'वायरूटल' कीवर्ड nessisary है यदि आप किसी को अपनी विधि या संपत्ति को ओवरराइड करना चाहते हैं, तो इसे 'छुपाएं' के बजाय।

तो यह सब विरासत और बहुरूपता पर लागू होता है। एक व्युत्पन्न वर्ग वर्चुअल विधि को ओवरराइड कर सकता है और इसे अपना कार्यान्वयन कर सकता है (या उस विधि में मूल कार्यान्वयन को भी कॉल कर सकता है)। ओवरराइडिंग करके, आप guarentee कर सकते हैं कि मूल कार्यान्वयन के बजाय आपकी नई विधि को बहुरूप रूप से बुलाया जाएगा।

उलटा, 'नया' कीवर्ड का उपयोग करके, आप डेटा सदस्यों और विधियों को 'छुपा' सकते हैं। यह आपको अपना स्वयं का कार्यान्वयन करने की अनुमति देगा, लेकिन आपके नए कार्यान्वयन को polymorphically निष्पादित नहीं करता है, यह बेस क्लास कार्यान्वयन का उपयोग करेगा।

Virual Keyword

Versioning with the Override and New Keywords (C# Programming Guide)

0

वर्चुअल सुनिश्चित है कि विरासत में मिली बच्चों कक्षाएं उन्हें लागू करने संपत्ति को ओवरराइड करने से आधार वर्ग को ओवरराइड। इसके बिना वर्चुअल कीवर्ड, एक बच्चे ऑब्जेक्ट आधार कार्यक्षमता को ओवरराइड नहीं कर सकता है।

4

वह अपने मॉडल में वर्चुअल कीवर्ड का उपयोग करने का कारण Change Tracking proxies सक्षम करना है। यह एंटीटी फ्रेमवर्क (संपादित करें: एनएचबीरनेट, और संभवतः किसी भी अन्य ओएम धन्यवाद @ डनलुडविग) के लिए विशिष्ट है, और यह ईएफ को उन इकाइयों को स्वचालित रूप से प्रबंधित करने की अनुमति देता है जिन्हें आप डेटाबेस में मैप कर रहे हैं।

MSDN से

:

प्रत्येक संपत्ति है कि डाटा मॉडल गैर सील (विजुअल बेसिक में NotOverridable), सार्वजनिक, और आभासी होना आवश्यक है में एक इकाई प्रकार की संपत्ति को मैप किया है (overridable में विजुअल बेसिक) एक्सेसर्स प्राप्त करें और सेट करें।

+0

आपको NHibernate में गुणों को 'आभासी' के रूप में चिह्नित करने की भी आवश्यकता है, इसलिए तकनीकी रूप से यह ईएफ के लिए विशिष्ट नहीं है। एनएचबेर्नेट भी एफके प्रबंधन और संपत्ति उत्सुक/आलसी लोडिंग उद्देश्यों के लिए गतिशील प्रॉक्सी का उपयोग करता है। – danludwig

6

किसी को भी मेरे लिए समझा सकते हैं:

  1. इस विशेष संदर्भ

    अन्य उपयोगकर्ताओं को यहाँ में शब्द 'आभासी' के प्रयोजन बहुत अच्छा संदर्भ के साथ अच्छी तरह से इस जवाब दे दिया।

  2. 'वर्चुअल' आवश्यक है?

    यह निर्भर करता है। कभी-कभी यह जरूरी है, कभी-कभी यह अनिवार्य है।

  3. कुछ लोग 'वर्चुअल' का उपयोग क्यों करते हैं और अन्य नहीं करते हैं?

    जब वे इसकी आवश्यकता होती है, तो वे इसका उपयोग करते हैं, या जब उन्हें लगता है कि उन्हें इसकी आवश्यकता हो सकती है।

  4. क्यों विदेशी लोग परिभाषित करते समय कुछ लोग केवल 'वर्चुअल' का उपयोग करते हैं?

    जब इकाई की रूपरेखा और NHibernate की तरह वस्तु संबंधपरक मानचित्रण उपकरण द्वारा उपयोग के लिए विदेशी कुंजी को परिभाषित करने, virtual क्योंकि इन ORM उपकरण गतिशील रूप से एक नया वर्ग है कि अपने वर्ग से विरासत बनाने अक्सर आवश्यक है। ये "डायनामिक प्रॉक्सी" कक्षाएं विदेशी कुंजी स्थिरता को बनाए रखने के लिए आवश्यक अतिरिक्त व्यवहार प्रदान करने के लिए आपके virtual गुणों को ओवरराइड करती हैं। NHibernate के मामले में, सभी गुण (केवल विदेशी कुंजी नहीं) virtual चिह्नित किया जाना चाहिए। ऐसा इसलिए है क्योंकि एनएच गतिशील प्रॉक्सी आपके व्यवहार पर डेटाबेस से पुनर्प्राप्त करने के लिए कौन से गुणों को लोड करने के लिए कस्टम व्यवहार जोड़ते हैं, और जो लोडिंग से बचने के लिए।

  5. 'आभासी' शब्द का सबसे अच्छा अभ्यास उपयोग क्या है?

    जब आप किसी सदस्य (विधि या संपत्ति) को अधिक व्युत्पन्न कक्षा में ओवरराइड करने का इरादा रखते हैं तो इसका उपयोग करें। sealed चिह्नित वर्गों में उनका उपयोग न करें।

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