2009-11-13 9 views
5

यह प्रश्न सी # आंतरिक सार वर्ग, के बाहर उपयोग को छिपाने के तरीके के समान है, लेकिन मेरा प्रेरणा अलग है।सार्वजनिक असंतुलन वर्ग के उप-वर्ग को समान असेंबली में टाइप करने के लिए कैसे सीमित करें और इस प्रकार संरक्षित सदस्यों को आंतरिक प्रकारों में टाइप किया गया है

internal class InternalTypeA {...} 

public class PublicClass 
{ 
    private readonly InternalTypeA _fieldA; 

    ... 
} 

ऊपर ठीक संकलित: यहाँ परिदृश्य

मैं निम्नलिखित के साथ शुरू किया है। लेकिन फिर मैंने तय कर लिया है कि मैं एक आधार वर्ग निकालने चाहिए और निम्नलिखित लिखने का प्रयास किया:

public abstract class PublicBaseClass 
{ 
    protected readonly InternalTypeA _fieldA; 

    ... 
} 

और इस तरह की समस्या है, संरक्षित सदस्य विधानसभा के बाहर दिखाई दे रहा है, लेकिन एक आंतरिक प्रकार की है, तो यह नहीं होगा संकलन।

हाथ में यह मुद्दा है कि मैं कैसे (या मैं?) संकलक को बता सकता हूं कि केवल उसी वर्ग में सार्वजनिक कक्षाएं जैसे कि सार्वजनिकबेस क्लास इसके उत्तराधिकारी हो सकता है और इसलिए _fieldA को असेंबली के बाहर एक्सपोज़ नहीं किया जाएगा?

या ऐसा करने का एक और तरीका है जो मैं करना चाहता हूं, एक सार्वजनिक सुपर क्लास और सार्वजनिक आधार वर्गों का एक सेट है जो सभी एक ही असेंबली में हैं और उस असेंबली से अपने सामान्य ("संरक्षित") कोड?

public abstract class PublicBaseClass 
{ 
    private readonly InternalTypeA _fieldA; 

    protected object FieldA { get { return _fieldA; } } 

    ... 
} 

public class SubClass1 : PublicBaseClass 
{ 
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
} 

public class SubClass2 : PublicBaseClass 
{ 
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
} 

लेकिन वह बदसूरत है:

केवल विचार मैं अब तक पड़ा है निम्नलिखित है!

उत्तर

5

सीएलआर एक परिवार और एस्परप्लेस एक्सेसिबिलिटी प्रदान करता है जो आप जो चाहते हैं वह करेंगे, लेकिन इसका उपयोग करने के लिए सी # में सिंटैक्स नहीं है।

वर्कअराउंड परिवर्तनीय फ़ील्ड को आंतरिक बनाना है, और आपको इसे असीमित रूप से एक्सेस न करने के लिए अपनी असेंबली में कोड पर भरोसा करना होगा।

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

+1

हाँ, FamilyAndAssembly वास्तव में मैं क्या चाहता हूँ। मैं सहमत हूं कि आंतरिक सदस्यों का उपयोग ऊपर मेरे हैक से बेहतर है। आश्चर्य है कि मैंने इसके बारे में क्यों नहीं सोचा था। शायद क्योंकि मैं बहुत अधिक चीजों से नफरत करता हूं। जानकारी के लिए धन्यवाद! –

+0

आयु, मुझे यह भी काफी परेशान लगता है, लेकिन दुर्भाग्य से हमें कुछ मिलना है :( – thecoop

0

इससे निपटने का सबसे साफ तरीका सार्वजनिक इंटरफेस और निजी कक्षाओं का उपयोग है। यदि आपका मौजूदा कोड रीफैक्टरिंग यह हमेशा एक विकल्प नहीं है। उस रूपांतरण के दर्द को कम करने का एक आसान तरीका एक इंटरफेस के बजाय सार्वजनिक सार वर्ग का उपयोग करना और एक स्थिर फैक्ट्री विधि का पर्दाफाश करना है।

उदाहरण:

public abstract class MyClass 
{ 
    public static MyClass New() 
    { return new InternalMyClass(); } 
} 

class InternalMyClass : MyClass 
{ } 
+0

यह दृष्टिकोण काम नहीं करेगा क्योंकि मुझे आंतरिक प्रकार के लिए InternalMyClass की आवश्यकता है। –