2011-10-24 8 views
9

में ओवरलोड्स बनाम ओवरराइड PreviousOther1 और Other2 कक्षा की संपत्ति के लिए व्यवहार अंतर क्या हैं। Other2 की अतिभारित Previous संपत्ति की वापसी प्रकार सेवीबीनेट

नोट Other2 में बदल दिया गया, जबकि यह Other1 के लिए Base के रूप में रहती है।

Public Class Base 
    Private _Previous as Base 

    Protected Overridable ReadOnly Property Previous As Base 
     Get 
      Return _Previous 
     End Get 
    End Property 

    Public Sub New(Previous as Base) 
     _Previous = Previous 
    End Sub 
End Class 

Public Class Other1 
    Inherits Base 
    Private _Parent as SomeType 

    Protected Overrides ReadOnly Property Previous As Base 
     Get 
      Return _Parent.Previous.Something 
     End Get 
    End Property 

    Public Sub New(Parent as SomeType) 
     MyBase.New(Nothing) 
     _Parent = Parent 
    End Sub 
End Class 

Public Class Other2 
    Inherits Base 
    Private _Parent as SomeType 

    Protected Overloads ReadOnly Property Previous As Other2 
     Get 
      Return _Parent.Previous.Something 
     End Get 
    End Property 

    Public Sub New(Parent as SomeType) 
     MyBase.New(Nothing) 
     _Parent = Parent 
    End Sub 
End Class 

उत्तर

12

Jim Wooley's answer को मेरी टिप्पणी से एक के बाद, "यह यह छाया की तरह लग रहे अधिभारित संपत्ति। " मैंने this article में प्रकाश देखा।

तो, अन्य 2 वर्ग में ओवरलोड्स ओवरराइड की तुलना में छायांकन की तरह कुछ और कार्य करते हैं। वहाँ लेख है कि विशेष रूप से शिक्षाप्रद है में comments में से एक है:

भ्रम पैदा होती है क्योंकि कीवर्ड "Overloads" क्या एक सी # प्रोग्रामर पारंपरिक OO अर्थ में एक अधिभार पर विचार करता है नहीं है। यह छिपाने का एक प्रकार है जो VB.Net के लिए विशिष्ट है। आप ज्यादातर मामलों में कीवर्ड के साथ कीवर्ड शेड को स्वैप कर सकते हैं, और व्यवहार वही है। अंतर तब होता है जब आपके पास एकाधिक अधिभारित विधि हस्ताक्षर वाले बेस क्लास होते हैं। यदि आप किसी मिलान वाले नाम और शेडोज़ कीवर्ड के साथ सबक्लास में कोई विधि घोषित करते हैं, तो यह बेस क्लास में उस विधि के हर ओवरलोड को छुपाएगा। यदि आप इसके बजाय ओवरवर्क्स कीवर्ड का उपयोग करते हैं, तो यह केवल एक समान हस्ताक्षर के साथ बेस क्लास विधि को छुपाएगा।

+0

'छाया' कीवर्ड की तरह लगता है कि आसानी से एलएसपी का गंभीर उल्लंघन हो सकता है। – Panzercrisis

2

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

Public Class OldMath 
    Public Overridable Function DoSomething(val1 As Integer) As Integer 
     Return val1 + val1 
    End Function 
End Class 

Public Class NewMath 
    Public Overrides Function DoSomething(val1 As Integer) As Integer 
     Return val1 * val1 
    End Function 
    Public Overloads Function DoSomething(val1 As Integer, val2 As Integer) As Integer 
     Return val1 * val2 
    End Function 
End Class 
+0

मैं समझता हूं कि, लेकिन ओवरलोड्स रिटर्न प्रकार के अन्य 2 में संशोधन की अनुमति देता है, क्या यह ओवरराइड प्रोपेरेटी की तरह व्यवहार करेगा जब संदर्भ बेस प्रकार के रूप में घोषित किया गया हो? – DavRob60

+0

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

+0

@ DavRob60 आप रिटर्न प्रकार, केवल इनपुट पैरामीटर पर अधिभार नहीं कर सकते हैं। यदि आपके इनपुट पैरामीटर अलग हैं और आपका रिटर्न टाइप अलग है, तो जिसे कॉल किया जाएगा, वह सबसे अच्छा मिलान निर्धारित करने के लिए एक संकीर्ण सम्मेलन का उपयोग करके कॉलिंग पैरामीटर के सर्वोत्तम मिलान पर आधारित होगा। –

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