2009-03-18 8 views
9

मैं कहीं भी पढ़ रहा था कि .NET Framework लाइब्रेरी में एक सीलबंद क्लास को विस्तारित करने के इच्छुक मुद्दे को कैसे संभालना है।उस कक्षा को कैसे संभालें जिसे आप विस्तारित करना चाहते हैं जिसे .NET लाइब्रेरी में सील कर दिया गया है?

यह अक्सर एक आम और उपयोगी काम है, इसलिए मुझे यह सोचने लगा, इस मामले में, कौन से समाधान हैं? मेरा मानना ​​है कि मेरे द्वारा पढ़े गए लेख में एक सीलबंद वर्ग का विस्तार करने के लिए एक "विधि" प्रदर्शित किया गया था, लेकिन अब मुझे याद नहीं है (यह विस्तार विधियां नहीं थी)।

क्या कोई अन्य तरीका है? धन्यवाद

+0

अत्यधिक संबंधित: http://stackoverflow.com/questions/554145/liskov-substition-and-composition – cregox

उत्तर

8

'नकली' विरासत है। यही है, आप आधार वर्ग को लागू करने और किसी भी इंटरफेस अन्य वर्ग को लागू करता है: स्पष्ट रूप से नहीं

class MyNewClass : BaseClass, IDoSomething 
{ 
    SealedClass _backing = new SealedClass(); 
} 

यह होगा:

// Given 
sealed class SealedClass : BaseClass, IDoSomething { } 

// Create 
class MyNewClass : BaseClass, IDoSomething { } 

फिर आप एक निजी सदस्य है, मैं आम तौर पर यह _backing, इस प्रकार फोन जैसे हस्ताक्षरों के साथ तरीकों के लिए काम करते हैं:

void NoRefactoringPlease(SealedClass parameter) { } 

तो वर्ग आप कुछ बिंदु पर ContextBoundObject से विरासत में मिली का विस्तार करना चाहते, this article पर एक नज़र डालें। पहला आधा COM है, दूसरा नेट। यह बताता है कि आप प्रॉक्सी विधियों कैसे कर सकते हैं।

इसके अलावा, मैं कुछ भी नहीं सोच सकता।

+0

इस रैपिंग-शैली विरासत के कारण, मैं वास्तव में "मुहरबंद" वर्गों के बिंदु को समझ नहीं पा रहा हूं - वे स्पष्ट रूप से * कक्षा में विस्तार करने से, आपको * रोकते हैं। सीलबंद वर्गों के आविष्कारकों को यह पता होना चाहिए था, तो वास्तव में उनमें क्या बात है? लोगों को कक्षा बढ़ाने के लिए प्रोत्साहित करने के लिए? कक्षा बढ़ाने के लिए इसे 'अधिक दर्द' बनाने के लिए? दस्तावेज में क्यों न कहें, "इस वर्ग को विरासत में नहीं मिला"? – Jez

+0

@ जेज़ यदि आप "दस्तावेज़ों में बस कहें", इस वर्ग को विरासत में नहीं मिला जाना चाहिए "मैं इसे सीलबंद के रूप में सेट करना पसंद करता हूं और दस्तावेज़ों पर भरोसा नहीं करता हूं। लेकिन यह वास्तव में इसका उपयोग नहीं है। यह कुछ भी मामूली नहीं है, इसलिए, मैं आपको कुछ शोध करने की सलाह देता हूं। जैसा कि मैं पढ़ रहा हूं और 'मुहरबंद' के बारे में सीख रहा हूं, मैं अभी भी इसका उपयोग क्यों कर रहा हूं [http://geekswithblogs.net/gmamaladze/archive/2010/02/01/sealed_keyword.aspx), लेकिन बहुत से लोग लोग सोचते हैं कि कक्षाओं को डिफ़ॉल्ट रूप से बंद कर दिया जाना चाहिए और उसके बाद कीवर्ड 'अनदेखा' होना चाहिए। – cregox

+0

@ कावासा मुझे वास्तव में 'मुहरबंद' की मानसिकता पसंद नहीं है, जो कि डेवलपर पर भरोसा नहीं करना प्रतीत होता है। क्या होगा यदि डेवलपर उचित रूप से कक्षा का विस्तार करना चाहता है? यह कीवर्ड सिर्फ गधे में दर्द का अधिक बनाता है। यह एक बग है, एक सुविधा नहीं, और मैंने अन्यथा कोई ठोस तर्क नहीं देखा है। दोबारा, मुझे किसी वर्ग को विस्तार न करने के लिए "प्रोत्साहित" करने की कोई बात नहीं है, लेकिन आखिरकार, डेवलपर को इस मुद्दे को मजबूर करने में सक्षम होना चाहिए और किसी कीवर्ड द्वारा रोका नहीं जा सकता है (या रैपिंग का उपयोग करने के लिए मजबूर होना, उचित ओओपी तोड़ना)। अधिक पढ़ने और चर्चा करने और विचार करने के बाद – Jez

0

विस्तार विधियों के बारे में कैसे? आप विरासत प्रतिबंध से निपटने के बिना, अतिरिक्त तरीके "अतिरिक्त" जोड़ सकते हैं।

2

शायद Decorator pattern का उपयोग करें?

विस्तार विधियों के अलावा, यह एकमात्र समझदार तकनीक है जिसे मैं सोच सकता हूं।

2

नहीं, आप किसी भी वैध तरीके से मुहरबंद कक्षा का विस्तार नहीं कर सकते हैं।

TypeMock आपको नकली सीलबंद कक्षाओं की अनुमति देता है, लेकिन मुझे संदेह है कि वे आपको उत्पादन कोड के लिए एक ही तकनीक का उपयोग करने के लिए प्रोत्साहित करेंगे।

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

विरासत में संरचना को पसंद करें - यह मेरे अनुभव में बहुत अधिक मजबूत है। इस पर अधिक के लिए "प्रभावी जावा (द्वितीय संस्करण)" में आइटम 16 देखें।

+0

खतरों और दिशा की चेतावनी के लिए धन्यवाद (पुस्तक की सिफारिश)। – dotnetdev

+1

प्रभावी जावा एक शानदार पुस्तक है, यहां तक ​​कि सी # डेवलपर्स के लिए भी। यह सब सी # के लिए प्रासंगिक नहीं है, लेकिन यह बेहद अच्छी तरह लिखा गया है। –

+1

मैं आपके परीक्षण वातावरण के बाहर TypeMock का उपयोग करने की अनुशंसा नहीं करता। –

2

एक्सटेंशन विधियों के बिना एक सीलबंद कक्षा को "विस्तारित" करने का एकमात्र तरीका यह है कि इसे लपेटकर। उदाहरण के लिए:

class SuperString 
{ 
    private String _innerString; 

    public SuperString(String innerString) 
    { 
     _innerString = innerString; 
    } 

    public int ToInt() 
    { 
     return int.Parse(_innerString); 
    } 
} 

आपको स्ट्रिंग क्लास के समान सभी विधियों/गुणों का खुलासा करना होगा।

कुछ ढांचे आपको मौजूदा वस्तुओं का विस्तार करने की अनुमति देते हैं। डब्ल्यूपीएफ में, निर्भरता गुण देखें। विंडोज फॉर्म के लिए, IExtenderProvider देखें।

6

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

6

इस विधि का औपचारिक नाम से पहले ही उल्लेख किया जा चुका है, लेकिन मुझे यह औपचारिक नाम नहीं पता है, इसलिए यह यहां है। यह उदाहरण टेक्स्टबॉक्स वर्ग (वीबी में उदाहरण) "विस्तारित करता है"। मेरा मानना ​​है कि इस विधि का लाभ यह है कि आपको अंतर्निहित सदस्यों को स्पष्ट रूप से कोड या बेनकाब करने की आवश्यकता नहीं है। उम्मीद है कि यह प्रासंगिक है:

वीबी क्लास मॉड्यूल "MyTextBox":

public Base as TextBox, CustomProperty as Integer 

Private Sub Init(newTextBox as TextBox) 
    Set Base = newTextBox 
End Sub 

public Property Get CustomProperty2() As String 
    CustomProperty2 = "Something special" 
End Property 

कोड फोन के लिए, आप कह सकते हैं:

Dim MyBox as New MyTextBox 
MyBox.Init MyForm.TextBox3 
यहां से

आप की पहुंच है सब में निर्मित सदस्यों , साथ ही आपके कस्टम सदस्यों।

Debug.Print MyBox.Base.Text 
MyBox.CustomProperty = 44 

अतिरिक्त पॉलिश के लिए, आप वर्ग के सामान्य प्रॉपर्टी बेस बना सकते हैं, और फिर आप छोड़ सकते हैं "बेस" जब आप आधार वर्ग के गुणों कहते हैं। आप इस तरह बेस सदस्यों फोन:

Debug.Print MyBox().Text 
MyBox().Text = "Hello World" 

VBA Demo

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

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