2008-10-01 13 views
6

में MyClass VB.Net के MyClass कीवर्ड के लिए यथार्थवादी उपयोग क्या है?वीबी.Net

मैं technical usage of MyClass समझता हूं; मैं असली दुनिया में इसका व्यावहारिक उपयोग समझ में नहीं आता।

MyClass का उपयोग केवल तभी समझ में आता है जब आपके पास कोई आभासी (अतिसंवेदनशील) सदस्य हो। लेकिन इसका मतलब यह भी है कि आप उप वर्गों में ओवरराइड कार्यान्वयन को अनदेखा करना चाहते हैं। ऐसा लगता है कि आत्म-विरोधाभासी है।

मैं कुछ विकसित उदाहरणों के बारे में सोच सकता हूं, लेकिन वे व्यावहारिक उपयोग के बजाय बस खराब डिजाइन हैं।

उत्तर

1

MyClass, एक संकलक के नजरिए से, एक call अनुदेश के पक्ष में एक callvirt अनुदेश छोड़ एक तरीका है। अनिवार्य रूप से जब आप आभासी अर्थशास्त्र (callvirt) के साथ एक विधि को कॉल करते हैं, तो आप संकेत दे रहे हैं कि आप सबसे व्युत्पन्न विविधता का उपयोग करना चाहते हैं। ऐसे मामलों में जहां आप व्युत्पन्न विविधताओं को छोड़ना चाहते हैं, आप MyClass (call) का उपयोग करते हैं। जबकि आपने कहा है कि आप मूल अवधारणा को समझते हैं, मुझे लगा कि यह एक अंतर्निहित समझ के बजाय, एक कार्यात्मक दृष्टिकोण से इसका वर्णन करने में मदद कर सकता है। यह MyBase के साथ MyBase के साथ सक्रिय प्रकार के बजाय MyBase के साथ आधार प्रकार के दायरे के साथ MyBase के समान रूप से समान है।

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

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

+0

मेरे 5 साल पुराने प्रश्न का उत्तर देने के लिए धन्यवाद :) मुझे लगता है कि "खराब डिजाइन पसंद" जवाब है; निजी मुहरबंद/सार्वजनिक आभासी बहुत बेहतर लगता है। –

+0

@RobertTaylor: खुशी है कि मैं मदद कर सकता हूं। मैं एक स्पष्ट उत्तर की कमी पर हैरान था, इसलिए मुझे लगा कि मैं इसे संकलक लेखक के परिप्रेक्ष्य से उत्तर दूंगा। मैं अभी भी खुद को सीख रहा हूं, लेकिन इसका मतलब यह नहीं है कि मुझे पता है कि थोड़ा सा उपयोगी नहीं है। –

-1

मुझे लगता है कि एकमात्र मामला मैं इसके लिए उपयोग देख सकता हूं, अगर आप मूल स्थिति चाहते हैं, और एक ही समय में विरासत की स्थिति हो? अर्थात। जहां आप किसी सदस्य का उत्तराधिकारी बनने में सक्षम होना चाहते हैं, लेकिन आप उस सदस्य के लिए मूल्य तक पहुंचने की क्षमता चाहते हैं जिसे विरासत में बदला नहीं गया है?

+0

तो उस सदस्य को पहली जगह क्यों ओवरराइड करने की अनुमति दें? –

1

बहुरूपता

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

"MyClass किसी भी व्युत्पन्न क्लास ओवरराइड द्वारा प्रतिस्थापित किए बिना वर्तमान क्लास इंस्टेंस सदस्यों को संदर्भित करने का एक तरीका प्रदान करता है। MyClass कीवर्ड मूल रूप से कार्यान्वित किए गए वर्ग के वर्तमान उदाहरण का जिक्र करते हुए ऑब्जेक्ट वैरिएबल की तरह व्यवहार करता है।"

यह भी ध्यान रखें कि आप साझा क्लास में MyClass का उपयोग नहीं कर सकते हैं।

MyClass के माध्यम से बहुरूपता को लागू करने का एक अच्छा उदाहरण http://www.devarticles.com/c/a/VB.Net/Implementing-Polymorphism-in-VB.Net/

+0

आपने उद्धृत किया है "MyClass किसी भी व्युत्पन्न क्लास ओवरराइड द्वारा प्रतिस्थापित किए बिना वर्तमान क्लास इंस्टेंस सदस्यों को संदर्भित करने का एक तरीका प्रदान करता है।" फिर अपने सदस्यों को पहले स्थान पर ओवरराइड करने योग्य क्यों चिह्नित करें? –

-3

पर आपको इसकी आवश्यकता यदि आप एक श्रृंखलित निर्माता कॉल करना चाहते है।

Public Sub New(ByVal accountKey As Integer) 
    MyClass.New(accountKey, Nothing) 
End Sub 

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String) 
    MyClass.New(accountKey, accountName, Nothing) 
End Sub 

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String, ByVal accountNumber As String) 
    m_AccountKey = accountKey 
    m_AccountName = accountName 
    m_AccountNumber = accountNumber 
End Sub 
+0

नहीं; Me.New (...) या MyBase.New (...) ठीक काम करेगा। –

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