2009-07-23 12 views
14

में "ओवरलोड" कीवर्ड क्या आपको वास्तव में अधिभार विधियों के लिए इस कीवर्ड की आवश्यकता है? अधिभार कीवर्ड बनाम उपयोग करने के बीच क्या अंतर है बस अलग विधि हस्ताक्षर होने?वीबीएनईटी

उत्तर

15

उसी कक्षा में, Overloads कीवर्ड वैकल्पिक है, लेकिन यदि एक विधि Overloads या Overrides घोषित की गई है, तो आपको इसे उस विधि के सभी अधिभारों के लिए उपयोग करना होगा।

' this is okay 
Sub F1(s as String) 
Sub F1(n as Integer) 

' This is also okay 
Overloads Sub F2(s as String) 
Overloads Sub F2(n as Integer) 

' Error 
Overloads Sub F3(s as String) 
Sub F3(n as Integer) 

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

यदि किसी बेस क्लास में कई अधिभारित विधियां हैं और आप व्युत्पन्न कक्षा में एक ओवरलोडेड विधि जोड़ना चाहते हैं, तो आपको Overloads कीवर्ड के साथ व्युत्पन्न कक्षा में विधि को चिह्नित करना होगा, अन्यथा बेस क्लास में सभी ओवरलोडेड विधियां हैं व्युत्पन्न कक्षा में अनुपलब्ध।

अधिक जानकारी के लिए MSDN देखें।

+1

आह, इन बेकार वीबी.NET कीवर्ड में से एक, संपत्ति के लिए "केवल पढ़ने के लिए", वैकल्पिक पैरामीटर के लिए "वैकल्पिक" या "ByVal": डी –

+0

@RayKoopa Yup! (लेकिन "वैकल्पिक" वैकल्पिक नहीं है: डी) – unnknown

+0

हाँ, दुख की बात है। इस बीच, मैंने वीएस Uservoice पर एक वीबी भाषा डिजाइनर के साथ बात की, और इन्हें रखने के लिए कारण यह है क्योंकि भाषा को स्वचालित रूप से संपत्ति स्टब्स या अन्य चीजों को उत्पन्न करने में आईडीई का समर्थन करना चाहिए (उदाहरण के लिए यदि आप "केवल पढ़ने" लिखते हैं तो केवल एक स्टब प्राप्त करें)। वास्तव में, वीबी को आईडीई का समर्थन करने के लिए डिज़ाइन किया गया है, यह वीबी का समर्थन करने के लिए डिज़ाइन किया गया आईडीई नहीं है। अजीब! –

9

यह एक डिजाइन विचार था। बेशक यह (वीबी) को फ़ंक्शन हस्ताक्षर (जैसे सी #) द्वारा अधिभारित करने के लिए डिज़ाइन किया गया था - इसलिए अधिभार कीवर्ड को छोड़ दिया जा सकता था लेकिन अंत में यह केवल विज़ुअल बेसिक की अभिव्यक्ति के अनुरूप है (जो कुछ ओवरहेड मानते हैं) और यह केवल एक भाषा डिजाइन निर्णय था।

+0

ओपी ओवरलोड (क्यों विधियों के लिए अलग-अलग नाम हैं) के बारे में पूछ रहा है, क्यों अधिभार कीवर्ड का उपयोग नहीं करें। –

+4

@ एड्रियन गोडोंग: ओपी पूछ रहा है कि क्या वीबी में "अधिभार" कीवर्ड की आवश्यकता है - भले ही ओवरलोडिंग उपयोगी न हो (जैसे कि विभिन्न विधि नामों का उपयोग करने के विपरीत) –

+0

@ एड्रियन: यह गलत है - वह कीवर्ड – Dario

0

Overloads-कीवर्ड पूरी तरह से वैकल्पिक है - मुझे इसका उपयोग करने में फायदे नहीं दिखते हैं।

+0

ओपी ओवरलोड करने के तरीकों के बारे में पूछ रहा है (विधियों के लिए अलग-अलग नाम बनाम बनाम), अधिभार कीवर्ड का उपयोग क्यों नहीं करें। –

+0

यह गलत है - वह कीवर्ड के बारे में पूछता है: वह नामों के बारे में बात नहीं करता लेकिन हस्ताक्षर करता है, हम कहते हैं कि ओवरलोडिंग – Dario

3

मिकी डी सही है। ओवरलोडेड विधि घोषित ओवरलोड और अन्य कोई नहीं है जो बीच में कोई अंतर नहीं है।

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

"function 'Equals' must be declared 'Overloads' because another 'Equals' 
is declared 'Overloads' or 'Overrides'." 

:

Public Function Equals(ByVal otherProduct As Product) As Boolean ... 

आपको निम्न त्रुटि प्राप्त होगा:

Public Overrides Function Equals(ByVal obj As Object) As Boolean ... 

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

मैं व्यक्तिगत रूप से कभी ओवरलोडेड विधि ओवरलोड नहीं करता जब तक कि मेरे पास पसंद की स्थिति में पसंद न हो।

2

मैं ऐसी परिस्थिति में भाग गया जहां मुझे ओवरलोड कीवर्ड का उपयोग करने की आवश्यकता थी।

मेरे पास एक मूल वर्ग और विरासत वर्ग था।

Public Class DataManager 

    Public MustOverride Function LoadDataSet(ByVal TableName as String, ByVal SQL as SQLObject) as DataSet 

    Public Function LoadDataSet(ByVal TableName as String, ByVal SQL as String) as DataSet 
    Return LoadDataSet(TableName, new SQLObject(SQL)) 
    End Function 
End Class 

Public Class OracleDataManager 
    Inherits DataManager 

    Public Overloads Overrides Function LoadDataSet(ByVal TableName as String, ByVal SQLObj as SQLObject) as DataSet 
    // code here 
    End Function 

End Class 

इस उदाहरण में, मुझे ओवरलोड कीवर्ड का उपयोग करना पड़ा।

15

यह Google परिणामों में उच्च दिखाता है, और मुझे लगता है कि इसे यहां और अधिक स्पष्ट रूप से समझाया जा सकता है।

Overloads कीवर्ड का उपयोग करने का कोई कारण नहीं है जब आप एक ही कक्षा में विभिन्न विधियों को अधिभारित कर रहे हों। मुख्य कारण यह है कि आप Overloads का उपयोग करेंगे, व्युत्पन्न वर्ग को अपनी बेस क्लास से एक विधि को कॉल करने की अनुमति देना है जिसका ओवरलोडेड विधि के समान नाम है, लेकिन एक अलग हस्ताक्षर।

मान लीजिए आप दो वर्गों, Foo और SonOfFoo, जहां Foo से SonOfFoo inherits है। यदि FooDoSomething और SonOfFoo नामक विधि को लागू करता है, उसी नाम के साथ लागू विधि, SonOfFoo विधि पैरेंट क्लास के कार्यान्वयन को छुपाएगी ... भले ही दोनों विधियां अलग-अलग पैरामीटर लेती हैं। Overloads कीवर्ड निर्दिष्ट करने से व्युत्पन्न वर्ग विधि के मूल वर्ग के अधिभार को कॉल करने की अनुमति देगा। यह कैसे compiles पर

Class Foo 
    Public Sub DoSomething(ByVal text As String) 
     Console.WriteLine("Foo did: " + text) 
    End Sub 
End Class 

Class SonOfFoo 
    Inherits Foo 

    Public Sub DoSomething(ByVal number As Integer) 
     Console.WriteLine("SonOfFoo did: " + number.ToString()) 
    End Sub 
End Class 

Class Bar 
    Public Sub DoSomething(ByVal text As String) 
     Console.WriteLine("Bar did: " + text) 
    End Sub 
End Class 

Class SonOfBar 
    Inherits Bar 

    Public Overloads Sub DoSomething(ByVal number As Integer) 
     Console.WriteLine("SonOfBar did: " + number.ToString()) 
    End Sub 
End Class 

Sub Main() 
    Dim fooInstance As Foo = New SonOfFoo() 
    'works 
    fooInstance.DoSomething("I'm really a SonOfFoo") 
    'compiler error, Foo.DoSomething has no overload for an integer 
    fooInstance.DoSomething(123) 

    Dim barInstance As Bar = New SonOfBar() 
    'works 
    barInstance.DoSomething("I'm really a SonOfBar") 
    'compiler error, Bar.DoSomething has no overload for an integer 
    barInstance.DoSomething(123) 

    Dim sonOfFooInstance As New SonOfFoo() 
    'compiler error, the base implementation of DoSomething is hidden and cannot be called 
    sonOfFooInstance.DoSomething("I'm really a SonOfFoo") 
    'works 
    sonOfFooInstance.DoSomething(123) 

    Dim sonOfBarInstance As New SonOfBar() 
    'works -- because we used the Overloads keyword 
    sonOfBarInstance.DoSomething("I'm really a SonOfBar") 
    'works 
    sonOfBarInstance.DoSomething(123) 
End Sub 

यहाँ some information है:

यहाँ, Bar और SonOfBar कि Overloads कीवर्ड का उपयोग ऊपर प्रदर्शित करने के लिए कुछ कोड, क्लास Foo और SonOfFoo के रूप में वर्णित कार्यान्वित के साथ, और वर्गों के एक और जोड़ी है सीएलआई में अलग-अलग।

+0

तो डिफ़ॉल्ट 'छाया' है। –

+19

मुझे दुनिया में सबसे भूलभुलैया व्यक्ति होना चाहिए; मैं यहां Google खोज से आया था और जब मैंने अपना जवाब देखा तो मैंने चेहरे पर खुद को तोड़ दिया। –

+0

कार्यों के बारे में क्या? क्या आप कुछ जोड़ सकते हैं? – beppe9000