2010-05-07 13 views
6

एक आदेश प्रणाली का प्रतिनिधित्व निम्नलिखित वर्गों पर विचार करें: अबक्या किसी संपत्ति को ओवरराइड करना और VB.NET में व्युत्पन्न प्रकार वापस करना संभव है?

Public Class OrderBase 
    Public MustOverride Property OrderItem as OrderItemBase 
End Class 

Public Class OrderItemBase 
End Class 

, मान लीजिए हम आदेश वर्गों में से एक अधिक विशिष्ट समूह को इन कक्षाओं का विस्तार करने के OrderBase की कुल प्रकृति रखते हुए हैं:

Public Class WebOrder 
    Inherits OrderBase   

    Public Overrides Property OrderItem as WebOrderItem 
    End Property 
End Class 

Public Class WebOrderItem 
    Inherits OrderItemBase 
End Class 

वेबऑर्डर क्लास में ओवर्रिडन संपत्ति एक त्रुटि का कारण बताएगी कि रिटर्न टाइप ऑर्डरबेस में परिभाषित से भिन्न है ... हालांकि, रिटर्न टाइप ऑर्डरबेस में परिभाषित प्रकार का उप-वर्ग है। वीबी क्यों इसकी अनुमति नहीं देगा?

+0

अपने ऑर्डर आइटम को सरणी के रूप में परिभाषित करना एक बुरा विचार है। एक सूची या Ienumerable का प्रयोग करें। –

+0

मेरे असली कोड में वे सूचियां हैं।() के साथ भ्रम के लिए खेद है। –

+1

कारणों और चाल/कामकाज के लिए [इस सी # प्रश्न] के जवाब भी देखें (http://stackoverflow.com/questions/157119/c-sharp-can-i-override-with-derived-types)। ([सी # की विधि हस्ताक्षर "नया" वीबी.Net में "छाया" है] (http://stackoverflow.com/questions/8575418/difference-between-shadows-vb-net-and-new-c)) –

उत्तर

7

आप ऐसा नहीं कर सकते - यह आधार पर परिभाषित हस्ताक्षर बदल रहा है। क्या आप जेनरिक उपयोग करने की आवश्यकता करने के लिए कोशिश कर रहे हैं करने के लिए:

Public Class OrderBase(Of T As IOrderItem) 
    Public ReadOnly Property OrderItems As IList(Of T) 
End Class 

मेरे विजुअल बेसिक जंग लगी है इसलिए उम्मीद है कि कि सही है ...

+0

आपका वाक्यविन्यास ठीक था, लेकिन जेनेरिक जाने के बाद आप एक चीज चूक गए: अब आपको संपत्ति को ओवरराइड करने की आवश्यकता नहीं है - मूल कार्यान्वयन पहले से ही सही होगा। इसके अलावा, अब हम ऑर्डर इटम्स के लिए बेस क्लास के बजाय इंटरफ़ेस का उपयोग करने में सक्षम होंगे। मैंने इसे तुम्हारे लिए साफ कर लिया। –

+0

इसके अलावा - मैंने एक सरणी के बजाय सूची का उपयोग करने के बारे में मेरी टिप्पणी शामिल की। मुझे यह पसंद नहीं है बस इसे वापस करें। –

+0

संपत्ति को अतिसंवेदनशील में बदल दिया- इसके अलावा, मेरे लिए इसे स्वरूपित करने के लिए धन्यवाद। –

4

आप इसे अधिभावी पर अपनी कक्षा के हस्ताक्षर नहीं बदल सकते। हालांकि, आप एक व्युत्पन्न प्रकार लौट सकते हैं:

Public Overrides Property OrderItem() as OrderItemBase 
    Get 
     Return New WebOrderItem() 
    End Get 
End Property 

Public Sub Whatever() 
    Dim item As WebOrderItem = DirectCast(OrderItem, WebOrderItem) 
End Sub 

वैकल्पिक रूप से, अगर आप अधिक सख्ती से प्रकार लागू करना चाहते हैं सामान्य प्रकार की कमी के साथ जेनरिक उपयोग करते हैं, जैसा कि नीचे दिखाया:

Public MustInherit Class OrderBase(Of T As OrderItemBase) 
    Public MustOverride ReadOnly Property OrderItem() As T 
End Class 

Public Class OrderItemBase 
End Class 

Public Class WebOrder(Of T As WebOrderItem) 
    Inherits OrderBase(Of T) 

    Public Overrides ReadOnly Property OrderItem() As T 
     Get 
      Return New WebOrderItem() 
     End Get 
    End Property 
End Class 

Public Class WebOrderItem 
    Inherits OrderItemBase 
End Class 

या ऐसा करने के

Public Class WebOrder 
    Inherits OrderBase(Of WebOrderItem) 

    Public Overrides ReadOnly Property OrderItem() As WebOrderItem 
     Get 
      Return New WebOrderItem() 
     End Get 
    End Property 
End Class 
+0

दुर्भाग्य से, यह किसी को उदा। उन ऑब्जेक्ट्स की एक सूची रखें जो ऑर्डरबेस के कुछ प्रकार का प्रतिनिधित्व करते हैं, ऑर्डरइटम पर कॉल करें, और ऑर्डरइटमबेस से प्राप्त कुछ ऑब्जेक्ट प्राप्त करें। हालांकि, यह कॉन्वर्स इंटरफेस के साथ ऐसा कर सकता है। – supercat

3

एक दृष्टिकोण एक संरक्षित overridable विधि है, और फिर एक सार्वजनिक गैर overridable विधि है जो ov कॉल: आप WebOrder रूप में अच्छी तरह एक सामान्य वर्ग होने के लिए नहीं करना चाहते हैं ग़लत एक किसी भी समय व्युत्पन्न वर्ग में फ़ंक्शन के लिए वापसी मूल्य बदलना चाहिए, ओवरराइड करने योग्य विधि का एक नोट ओवरराइड ओवरराइड एक नई अतिरंजित विधि को कॉल करता है जो अधिक परिष्कृत प्रकार देता है, और सार्वजनिक फ़ंक्शन के पुराने संस्करण को भी उस के साथ छाया करता है नया ओवरराइड यदि vb.net ने एक वर्ग को एक ही सदस्य को ओवरराइड और छाया करने की अनुमति दी है, तो चीजें बहुत साफ हो जाएंगी, लेकिन ऐसा करने का कोई तरीका नहीं है।

Public Class CarFactory 
    Protected Overridable Function DerivedMakeCar() as Car 
    ' make a car 
    End Function 

    Public Function MakeCar() as Car 
    Return DerivedMakeCar() 
    End Function 

End Class 

Public Class FordFactory 
    Inherits CarFactory 

    Protected Overrides Function DerivedMakeCar() As Car 
    Return DerivedMakeFord() 
    End Function 

    Protected Overridable Function DerivedMakeFord() As Ford 
    ' Make a Ford 
    End Function 

    Public Shadows Function MakeCar() As Ford 
    Return DerivedMakeFord() 
    End Function 

End Class 

कुछ मामलों में एक आसान विकल्प एक सार्वजनिक overridable MakeCar() फ़ंक्शन जो हमेशा प्रकार Car की एक वस्तु देता है, लेकिन एक FordFactory के लिए हो सकता है यह भी एक MakeFord() फ़ंक्शन जो एक फोर्ड रिटर्न शामिल हैं।

ओवरराइड मेककर() फ़ंक्शन NotOverridable होगा और मेकफ़ोर्ड को बस कॉल करेगा। कुछ मायनों में, बाद वाला दृष्टिकोण क्लीनर हो सकता है, लेकिन यदि कोई आम नामकरण सम्मेलन है (उदाहरण के लिए कारखानों में मेकप्रोडक्ट विधि है जो सबसे व्युत्पन्न प्रकार लौटाती है) यह छाया का उपयोग करने के लिए उपयोगी हो सकती है।