2010-11-05 15 views
6

सी # में एक कक्षा बनाना संभव है जिसे आंतरिक रूप से (अनदेखा) से लिया जा सकता है, लेकिन फिर अन्य लोगों को मेरी सार्वजनिक कक्षा (मुहरबंद) से विरासत में मेरी लाइब्रेरी को संदर्भित करने से रोकना संभव है?क्या मैं कक्षा को अनदेखा कर सकता हूं लेकिन बाहरी रूप से सील कर सकता हूं?

उत्तर

9

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

संपादित करें:

public class MyFoo 
{ 
    internal MyFoo() 
    { 
    } 

    public static MyFoo CreateFoo() 
    { 
     return new MyFoo(); 
    } 
} 
+0

कूल जो बहुत अच्छा काम करता है। धन्यवाद! –

5

एरिक Lippert तीन तरीके यह करने के लिए कहते हैं। टीएल; डॉ: अपनी कक्षा को सील न करें, लेकिन अपनी कक्षा में एक आंतरिक सार विधि शामिल करें, या सभी रचनाकारों को आंतरिक या निजी बनाएं, या कक्षा में मेटाडेटा जोड़ने के लिए PermissionSet विशेषता का उपयोग करें।

http://blogs.msdn.com/b/ericlippert/archive/2008/09/26/preventing-third-party-derivation-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

0

तुम भी कुछ इस तरह कर रही कोशिश कर सकते हैं।

internal class InternalExtendible 
{ 
    public string MyProperty { get; set; } 
} 

public sealed class ExternalSealedClass : InternalExtendible 
{ 
} 

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

+1

मेरे लिए हुआ, लेकिन बड़ी समस्या यह है कि यदि इस प्रकार का उपभोग करने या वापस करने के लिए सार्वजनिक पहुंच योग्य तरीके हैं - हस्ताक्षर क्या है? यदि आप 'बाहरीसेल्ड क्लास' का उपयोग करते हैं, तो आपके "वास्तविक" उत्तराधिकारी पात्र नहीं होंगे। यदि आप 'InternalExtensible' का उपयोग करते हैं, तो आपकी विधियां अब सार्वजनिक नहीं हो सकती हैं। – mquander

+0

@mquander क्या आप बस इंटरफ़ेस में प्रोग्रामिंग करके उस के आसपास नहीं जा सकते? यानी आपका हस्ताक्षर "शून्य DoSomething (IExtendableOrSealed आइटम) {...} जैसा दिखता है" – Michael

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

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