2009-08-03 9 views
19

मैं इस परियोजना के कोडबेस को दोबारा क्रियान्वित कर रहा हूं, जिसमें मैं वर्तमान में हूं ताकि कक्षा/इंटरफेस जो असेंबली की सीमाओं से परे उपयोगी न हों, को आंतरिक (सार्वजनिक रूप से) घोषित किया जाना चाहिए। ।मैं आंतरिक इंटरफेस के सदस्यों को कैसे कार्यान्वित कर सकता हूं

internal interface IFirstInterface 
{ 
    ... 
} 

internal interface ISecondInterface 
{ 
    IFirstInterface First{ get; } 
    ... 
} 

public class Implementer : ISecondInterface 
{ 
    public IFirstInterface First {get; private set;} 
    ... 
} 

मेरे सवालों का:

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

असंगत पहुँच:

  • मुख्य समस्या यह है ऊपर के बाद से यह कथित रूप से एक आंतरिक इंटरफ़ेस यानी मैं संकलक से निम्न त्रुटि प्राप्त है के बाद से मैं IFirstInterface के लिए एक सार्वजनिक गेटर नहीं हो सकता परिदृश्य के साथ है : संपत्ति प्रकार 'IFirstInterface' संपत्ति की तुलना में कम पहुँचा जा सकता है 'Implementer.First'

  • वहाँ है ई इस तरह से किसी भी तरह से?

    नोट: मुझे पता है वहाँ शायद इस रिफैक्टरिंग अभ्यास में कम मूल्य है कि लेकिन मैंने सोचा कि यह एक अच्छा तरीका है मुझे और अधिक गहराई से आंतरिक संशोधक के निहितार्थ को समझने के लिए किया जाएगा।

    +0

    तो इसकी एक विकल्प है, तो आप इंटरफ़ेस तरीकों सार्वजनिक होने के सीमा के आस-बजाय एक सार आधार वर्ग का उपयोग करके प्राप्त कर सकते हैं। –

    उत्तर

    45

    बस ध्यान दें - आपके द्वारा वास्तव में प्रदान किया गया कोड संकलित करता है, क्योंकि Implementer एक आंतरिक श्रेणी है। समस्या तब आती है जब Implementer सार्वजनिक है।

    public class Implementer : ISecondInferface 
    { 
        private IFirstInterface first; 
        IFirstInterface ISecondInterface.First { get { return first; } } 
    } 
    

    आप, वहाँ में सेटर नहीं हो सकता है क्योंकि आप स्पष्ट रूप से इंटरफ़ेस जो सेटर को परिभाषित नहीं करता लागू कर रहे हैं:

    तरीका यह दौर स्पष्ट इंटरफेस कार्यान्वयन उपयोग करने के लिए है। आप एक विकल्प के रूप ऐसा कर सकता है:

    public class Implementer : ISecondInterface 
    { 
        internal IFirstInterface First { get; private set; } 
        IFirstInterface ISecondInterface.First { get { return First; } } 
    } 
    

    यह दुर्भाग्यपूर्ण है कि आंतरिक इंटरफेस सार्वजनिक सदस्य - यह इस तरह बातें जटिल बना देता है। सार्वजनिक इंटरफ़ेस के लिए आंतरिक सदस्य होने के लिए अजीब बात होगी (यह इंटीरियर के लिए आंतरिक होगा - घोषणाकर्ता या घोषणाकर्ता?) लेकिन आंतरिक इंटरफेस के लिए यह बहुत अधिक समझ में आता है।

    +0

    आह, सही। मैं अपना प्रश्न संपादित करूंगा ताकि पाठकों के लिए यह भ्रमित हो। धन्यवाद! – jpoh

    10

    आंतरिक इंटरफेस के सदस्यों को सार्वजनिक रूप से लागू क्यों किया जाना चाहिए?

    जब आप एक इंटरफेस को परिभाषित, आप पहुँच स्तर के सदस्यों के लिए, के बाद से सभी इंटरफेस सदस्यों public हैं परिभाषित नहीं करते। भले ही इंटरफ़ेस internal है, फिर भी सदस्यों को public माना जाता है। जब आप ऐसे सदस्य का निहित कार्यान्वयन करते हैं तो हस्ताक्षर मिलान होना चाहिए, इसलिए इसे public होना चाहिए।

    गेटर उजागर, मैं, के बजाय एक स्पष्ट इंटरफ़ेस के कार्यान्वयन करने का सुझाव देते हैं और एक internal संपत्ति बनाने मूल्य का पर्दाफाश करने के बारे में:

    internal IFirstInterface First { get; private set; } 
    
    IFirstInterface ISecondInterface.First 
    { 
        get { return this.First; } 
    } 
    
    7

    मैं जानता हूँ कि इस पोस्ट में कुछ साल पुराना है लेकिन मुझे लगता है कि यह ध्यान देने योग्य यदि आप किसी सार्वजनिक वर्ग पर एक आंतरिक इंटरफ़ेस को लागू कर सकते हैं कि, निम्नलिखित लिंक देखें लायक है:

    http://forums.create.msdn.com/forums/p/29808/167820.aspx
    http://msdn.microsoft.com/en-us/library/aa664591%28VS.71%29.aspx

    पहले लिंक से एक उदाहरण:

    
    internal interface ISecretInterface 
    { 
        string Property1 { get; } 
    } 
    
    public class PublicClass : ISecretInterface 
    { 
        // class property 
        public string Property1 
        { 
         get { return "Foo"; } 
        } 
    
        // interface property 
        string ISecretInterface.Property1 
        { 
         get { return "Secret"; } 
        } 
    } 
    
    +0

    2011 से आपका उत्तर 200 से दो उत्तरों से अलग कैसे है? –

    +2

    ईमानदारी से मुझे नहीं पता और मैं देख सकता हूं कि मैंने इसे क्यों जोड़ा होगा हालांकि मुझे यह याद रखना याद है। यह कुछ भी नहीं जोड़ता है और मैं संशोधन इतिहास को देखकर इसे समझने की कोशिश कर रहा हूं यह देखने के लिए कि क्या कोई सुराग है लेकिन अभी भी कुछ भी नहीं है। शायद मैं एक गूंगा दिन था। – Robert

    +0

    किसी कारण से यह उत्तर मेरे लिए पहले की तुलना में उपभोग करना आसान है क्योंकि उत्तर की शुरुआत में स्पष्टीकरण मेरी स्थिति को संबोधित करता है और जो मैंने गुगल किया उससे मेल खाता है। तो स्पष्ट रूप से यह कहने के लिए धन्यवाद कि सार्वजनिक कक्षाएं आसानी से उपभोग्य तरीके से आंतरिक इंटरफेस को कार्यान्वित कर सकती हैं ;-)। – binki