2011-12-25 9 views
7

मुझे आश्चर्य है कि अगर वहाँ जो एक वर्ग से विरासत को सीमित करना एक तरीका है।वहाँ जो एक वर्ग या अंतरफलक के वारिस कर सकते हैं सीमित करने के लिए कोई तरीका है?

  • internal: कक्षा विधानसभा
  • sealed बाहर प्राप्त की जा करने के लिए अनुमति नहीं देता: वर्ग विरासत में मिला नहीं किया जा सकता

किसी कीवर्ड या जिस तरह से केवल कुछ वर्गों (मान लें कि यह है से जाने की अनुमति के लिए है उस नाम का उत्तराधिकारी केवल)?

इसके अलावा, मैं इस विशेष वर्ग सामान्य हो नहीं करना चाहती। मेरी चिंता का विषय सुरक्षा लेकिन सामान्य रूप में डिजाइन नहीं है।

जो मैं चाहता का उदाहरण:

  • क्लास ए
  • कक्षा बी ए
  • कक्षा सी से विरासत जहाँ तक मुझे पता के रूप में एक
+0

एक कक्षा आंतरिक बनाना न केवल बाहरी कक्षाओं को विरासत से रोकता है, बल्कि इसका उपयोग करने से भी रोकता है।बाहरी बालक्षकों को रोकने के लिए आपको विशेष चाल की आवश्यकता होती है, जैसे 'आंतरिक सार' विधियां, और यह इंटरफेस पर काम नहीं करती है। – CodesInChaos

+0

आपको किस तरह की सीमा पसंद आएगी? क्या आपने इनहेरिटेंस डेमांड पर एक नज़र डाली है? http://palisade.plynt.com/issues/2006Apr/link-demand/ –

+4

ध्यान दें कि किसी नामस्थान पर प्रतिबंधित करना बहुत अधिक सुरक्षा नहीं है, क्योंकि एक दुष्ट असेंबली केवल 'नेमस्पेस विस्मयकारी {सार्वजनिक वर्ग चोरी: गुप्त { }} 'और अब वे 'Awesome.Secret' तक पहुंचने के लिए' Awesome.Stolen' का उपयोग कर सकते हैं। –

उत्तर

16

क्या कुछ वर्गों को उस वर्ग का वारिस करने की अनुमति देने का कोई तरीका है?

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

https://msdn.microsoft.com/en-us/library/x4yx82e6(v=vs.100).aspx

बेशक, पूर्ण ट्रस्ट का मतलब पूर्ण विश्वास है। पूरी तरह से भरोसेमंद कोड जो कुछ भी चाहता है उसे प्राप्त कर सकता है।

मुझे संदेह है कि आप उन प्रतिबंधों को लागू करने की कोशिश कर रहे हैं जिन्हें आप वास्तव में लागू करने की कोशिश नहीं कर रहे हैं। क्या आप वर्णन कर सकते हैं कि आप यह मुश्किल काम करने की कोशिश क्यों कर रहे हैं? आप जो चाहते हैं उसे करने का शायद एक बेहतर तरीका है।

अद्यतन:

मैं एक ही विधानसभा में मेरी कक्षाओं के भीतर विरासत को सीमित करने की कोशिश कर रहा हूँ।

तो शायद आपको पहले स्थान पर यह कहना चाहिए था।

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

+0

अच्छा। हालांकि मैं इसका उपयोग नहीं कर सकता क्योंकि मैं नेट 3.5 – Odys

+1

@odyodyodys पर हूं: विरासत मांग .NET v1 के साथ भेज दी गई है। –

8

से विरासत नहीं कर सकते, internal का उपयोग कर यह नियंत्रित करने का एकमात्र तरीका है कि कक्षा का उत्तराधिकारी कौन हो सकता है। उत्तराधिकारियों एक अलग विधानसभा में होना चाहिए, तो आप एक और विधानसभा से कक्षाएं अपने विधानसभा InternalsVisibleTo विशेषता का उपयोग कर के आंतरिक देखने दे सकते हैं (लक्ष्य विधानसभा आदेश में इस पर हस्ताक्षर किए विधानसभाओं के साथ काम करने के लिए साइन इन होना चाहिए)।

+1

अच्छा जवाब है, लेकिन आपको काम करने के लिए InternalsVisibleTo पर हस्ताक्षर करने की आवश्यकता नहीं है। – Andy

+0

@ एंडी स्पष्टीकरण के लिए धन्यवाद। मैं यह उल्लेख करना भूल गया कि केवल हस्ताक्षरित असेंबली के लिए हस्ताक्षर की आवश्यकता है। मैंने पहली जगह पर हस्ताक्षर करने का जिक्र करने का फैसला किया, क्योंकि मुझे यह पता लगाने के लिए परेशानी हुई कि मैं अपने हस्ताक्षरित यूनिट परीक्षण असेंबली से अपने हस्ताक्षरित असेंबली के आंतरिक तरीकों का परीक्षण क्यों नहीं कर सका। – dasblinkenlight

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