vb.net

2009-01-12 10 views
11

में एक निजी विधि के साथ एक इंटरफेस को कार्यान्वित करें, मैं इस तरह से चौंक गया था। क्या कोई समझा सकता है कि यह क्यों काम करता है? इसका उपयोग करने का एक अच्छा उदाहरण भी अच्छा होगा।vb.net

Public Interface IFoo 
    Sub DoIt() 
End Interface 

Public Class Bar 
    Implements IFoo 

    Private DoIt() implements IFoo.DoIt 
End Class 

... 

Dim b as new Bar() 
b.DoIt() 'error 
CType(b, IFoo).DoIt() 'no error 
+1

तो कोड काम करता है? मैं आश्चर्यचकित हूँ। एक इंटरफ़ेस के विचार के विपरीत लगता है। – jcollum

उत्तर

11

एक निजी इंटरफ़ेस कार्यान्वयन होने के कारण मूल रूप से आपको अपने वर्ग 'एपीआई को बिना किसी इंटरफ़ेस को लागू करने की अनुमति मिलती है। आप IFoo को कार्यान्वित कर सकते हैं, लेकिन केवल IFoo के रूप में आपके साथ व्यवहार करने वाले एपीआई को यह जानने की आवश्यकता है।

MSDN कहते

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

6

मैं एक तरह से इस से चौंक गया था। क्या कोई समझा सकता है कि यह क्यों काम करता है? इसका उपयोग करने का एक अच्छा उदाहरण भी अच्छा होगा।

यह अवधारणा सी # के स्पष्ट इंटरफ़ेस कार्यान्वयन के अनुरूप काफी समान है। वहां भी, यदि आप उस इंटरफ़ेस को स्पष्ट रूप से टाइप करते हैं तो आप केवल इंटरफ़ेस के सदस्य तक पहुंच सकते हैं।

मैं पर टिप्पणी नहीं कर सकता क्यों .NET फ्रेमवर्क टीम ने महसूस किया कि यह सुविधा वास्तव में आवश्यक थी। यह कभी-कभी encapsulation को मजबूत कर सकता है लेकिन मुझे यकीन नहीं है। किसी भी मामले में, कुछ इंटरफ़ेस (इंटरफ़ेस) विरासत के बजाय संरचना का उपयोग करके हमेशा समान होता है।

+0

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

2

प्रश्न के पहले भाग अन्य पदों में कवर किया गया था, लेकिन मैं एक उदाहरण नहीं देखा। जेनेरिक इंटरफेस और उनके गैर-जेनेरिक समकक्षों को लागू करते समय मैं आमतौर पर इसका उपयोग करता हूं। उदाहरण के लिए, यदि मैं एक सामान्य अवलोकन करने योग्य सूची बनाना चाहता हूं, तो मैं आईएलआईस्ट इंटरफेस दोनों को लागू करना चाहता हूं।

Public Class ObservableList(Of T) 
    Implements INotifyCollectionChanged, 
       IList, 
       IList(Of T) 
End Class 

जब दोनों ILists लागू किए जाते हैं तो हम बहुत सारे डुप्लिकेट फ़ंक्शंस के साथ समाप्त होते हैं। कुछ एक ही हस्ताक्षर साझा करते हैं और स्पष्ट जैसे दोनों IList कार्यों को कार्यान्वित कर सकते हैं। लेकिन कुछ गैर-सामान्य कार्य सामान्य के बजाय वस्तुओं के साथ सौदा करते हैं। तो जोड़ें फ़ंक्शन के लिए, मैं दोनों कार्यान्वयन कार्य करता हूं, लेकिन क्लास को आसान बनाने के लिए गैर-जेनेरिक संस्करण निजी सेट करता हूं।

Public Sub Add(item As T) Implements System.Collections.Generic.ICollection(Of T).Add 
    'Add item to collection 
End Sub 

Private Function Add1(item As Object) As Integer Implements System.Collections.IList.Add 
    'Add item to collection 
End Function 

इस तरह, वर्ग पारित किया जा सकता है और एक IList रूप में इस्तेमाल किया है, लेकिन एक सांकेतिक शब्दों में बदलनेवाला संभावित अधिभार मनमुताबिक एक IList (टी के) के रूप में उपयोग करने के लिए हो जाता है।