में "ओवरलोड" कीवर्ड क्या आपको वास्तव में अधिभार विधियों के लिए इस कीवर्ड की आवश्यकता है? अधिभार कीवर्ड बनाम उपयोग करने के बीच क्या अंतर है बस अलग विधि हस्ताक्षर होने?वीबीएनईटी
उत्तर
उसी कक्षा में, 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 देखें।
यह एक डिजाइन विचार था। बेशक यह (वीबी) को फ़ंक्शन हस्ताक्षर (जैसे सी #) द्वारा अधिभारित करने के लिए डिज़ाइन किया गया था - इसलिए अधिभार कीवर्ड को छोड़ दिया जा सकता था लेकिन अंत में यह केवल विज़ुअल बेसिक की अभिव्यक्ति के अनुरूप है (जो कुछ ओवरहेड मानते हैं) और यह केवल एक भाषा डिजाइन निर्णय था।
ओपी ओवरलोड (क्यों विधियों के लिए अलग-अलग नाम हैं) के बारे में पूछ रहा है, क्यों अधिभार कीवर्ड का उपयोग नहीं करें। –
@ एड्रियन गोडोंग: ओपी पूछ रहा है कि क्या वीबी में "अधिभार" कीवर्ड की आवश्यकता है - भले ही ओवरलोडिंग उपयोगी न हो (जैसे कि विभिन्न विधि नामों का उपयोग करने के विपरीत) –
@ एड्रियन: यह गलत है - वह कीवर्ड – Dario
Overloads
-कीवर्ड पूरी तरह से वैकल्पिक है - मुझे इसका उपयोग करने में फायदे नहीं दिखते हैं।
ओपी ओवरलोड करने के तरीकों के बारे में पूछ रहा है (विधियों के लिए अलग-अलग नाम बनाम बनाम), अधिभार कीवर्ड का उपयोग क्यों नहीं करें। –
यह गलत है - वह कीवर्ड के बारे में पूछता है: वह नामों के बारे में बात नहीं करता लेकिन हस्ताक्षर करता है, हम कहते हैं कि ओवरलोडिंग – Dario
मिकी डी सही है। ओवरलोडेड विधि घोषित ओवरलोड और अन्य कोई नहीं है जो बीच में कोई अंतर नहीं है।
मैं बस यह इंगित करना चाहता था कि अधिभार कीवर्ड अनिवार्य है जब एक ही नाम वाली दूसरी विधि ओवरराइड या अधिभार घोषित की जाती है। उदाहरण के लिए, अगर आप इस तरह बराबर विधि ओवरराइड करता है, तो:
"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 ...
तो फिर तुम इस तरह एक अधिभार बनाना चाहते हैं अगर किसी ने ओवरलोड के रूप में कोई विधि घोषित की है, तो आपको वही त्रुटि मिल जाएगी, और आप उस विधि को अधिभारित करना चाहते हैं। आपको या तो अपनी विधि में अधिभार कीवर्ड जोड़ना होगा या इसे अन्य विधि से हटा देना होगा।
मैं व्यक्तिगत रूप से कभी ओवरलोडेड विधि ओवरलोड नहीं करता जब तक कि मेरे पास पसंद की स्थिति में पसंद न हो।
मैं ऐसी परिस्थिति में भाग गया जहां मुझे ओवरलोड कीवर्ड का उपयोग करने की आवश्यकता थी।
मेरे पास एक मूल वर्ग और विरासत वर्ग था।
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
इस उदाहरण में, मुझे ओवरलोड कीवर्ड का उपयोग करना पड़ा।
यह Google परिणामों में उच्च दिखाता है, और मुझे लगता है कि इसे यहां और अधिक स्पष्ट रूप से समझाया जा सकता है।
Overloads
कीवर्ड का उपयोग करने का कोई कारण नहीं है जब आप एक ही कक्षा में विभिन्न विधियों को अधिभारित कर रहे हों। मुख्य कारण यह है कि आप Overloads
का उपयोग करेंगे, व्युत्पन्न वर्ग को अपनी बेस क्लास से एक विधि को कॉल करने की अनुमति देना है जिसका ओवरलोडेड विधि के समान नाम है, लेकिन एक अलग हस्ताक्षर।
मान लीजिए आप दो वर्गों, Foo
और SonOfFoo
, जहां Foo
से SonOfFoo
inherits है। यदि Foo
DoSomething
और 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
के रूप में वर्णित कार्यान्वित के साथ, और वर्गों के एक और जोड़ी है सीएलआई में अलग-अलग।
तो डिफ़ॉल्ट 'छाया' है। –
मुझे दुनिया में सबसे भूलभुलैया व्यक्ति होना चाहिए; मैं यहां Google खोज से आया था और जब मैंने अपना जवाब देखा तो मैंने चेहरे पर खुद को तोड़ दिया। –
कार्यों के बारे में क्या? क्या आप कुछ जोड़ सकते हैं? – beppe9000
- 1. वीबीएनईटी
- 2. वीबीएनईटी
- 3. वीबीएनईटी
- 4. वीबीएनईटी
- 5. वीबीएनईटी
- 6. वीबीएनईटी
- 7. वीबीएनईटी
- 8. वीबीएनईटी
- 9. वीबीएनईटी
- 10. वीबीएनईटी
- 11. वीबीएनईटी
- 12. वीबीएनईटी
- 13. वीबीएनईटी
- 14. वीबीएनईटी
- 15. वीबीएनईटी
- 16. वीबीएनईटी
- 17. वीबीएनईटी
- 18. वीबीएनईटी
- 19. वीबीएनईटी
- 20. वीबीएनईटी
- 21. वीबीएनईटी
- 22. वीबीएनईटी
- 23. वीबीएनईटी
- 24. वीबीएनईटी
- 25. वीबीएनईटी
- 26. वीबीएनईटी
- 27. वीबीएनईटी
- 28. वीबीएनईटी
- 29. वीबीएनईटी
- 30. वीबीएनईटी
आह, इन बेकार वीबी.NET कीवर्ड में से एक, संपत्ति के लिए "केवल पढ़ने के लिए", वैकल्पिक पैरामीटर के लिए "वैकल्पिक" या "ByVal": डी –
@RayKoopa Yup! (लेकिन "वैकल्पिक" वैकल्पिक नहीं है: डी) – unnknown
हाँ, दुख की बात है। इस बीच, मैंने वीएस Uservoice पर एक वीबी भाषा डिजाइनर के साथ बात की, और इन्हें रखने के लिए कारण यह है क्योंकि भाषा को स्वचालित रूप से संपत्ति स्टब्स या अन्य चीजों को उत्पन्न करने में आईडीई का समर्थन करना चाहिए (उदाहरण के लिए यदि आप "केवल पढ़ने" लिखते हैं तो केवल एक स्टब प्राप्त करें)। वास्तव में, वीबी को आईडीई का समर्थन करने के लिए डिज़ाइन किया गया है, यह वीबी का समर्थन करने के लिए डिज़ाइन किया गया आईडीई नहीं है। अजीब! –