इंटरफ़ेस का उपयोग करते समय आप एक निजी सेटर को कैसे लागू करते हैं?


139

मैंने कुछ गुणों के साथ एक इंटरफ़ेस बनाया है।

यदि इंटरफ़ेस मौजूद नहीं था, तो क्लास ऑब्जेक्ट के सभी गुण सेट हो जाएंगे

{ get; private set; }

हालांकि, इंटरफ़ेस का उपयोग करते समय इसकी अनुमति नहीं है, तो क्या इसे प्राप्त किया जा सकता है और यदि ऐसा है तो कैसे?

जवाबों:


266

इंटरफ़ेस में आप केवल getterअपनी संपत्ति के लिए परिभाषित कर सकते हैं

interface IFoo
{
    string Name { get; }
}

हालाँकि, आपकी कक्षा में आप इसे बढ़ा सकते हैं private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}

1
यह निर्धारित करने के लिए प्रतीत नहीं होता है कि क्या सेटर सार्वजनिक है, भले ही इंटरफ़ेस में केवल एक गेटर हो।
माइक चेनल

6
@ माइकचेल थेल्स क्योंकि इंटरफ़ेस केवल न्यूनतम विधियों / एक्सेसरों को परिभाषित करता है। जब आप सीधे ऑब्जेक्ट का उपयोग कर रहे हों, तो आप अधिक जोड़ने के लिए स्वतंत्र हैं। हालाँकि जब कोई ऑब्जेक्ट इंटरफ़ेस के रूप में उपयोग करता है, तो इंटरफ़ेस में परिभाषित केवल वे तरीके / एक्सेसर्स उपयोग करने योग्य होते हैं।
मार्सेलो निकोलेटी

29

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

public interface IBar
{
    int Foo { get; }    
}

निजी सेटर सार्वजनिक एपी (किसी अन्य निजी सदस्य के रूप में) का हिस्सा नहीं है, इस प्रकार आप इसे इंटरफ़ेस में परिभाषित नहीं कर सकते हैं। लेकिन आप इंटरफ़ेस कार्यान्वयन के लिए किसी भी (निजी) सदस्यों को जोड़ने के लिए स्वतंत्र हैं। वास्तव में इससे कोई फर्क नहीं पड़ता कि क्या सेटर को सार्वजनिक या निजी के रूप में लागू किया जाएगा, या यदि सेटर होगा:

 public int Foo { get; set; } // public

 public int Foo { get; private set; } // private

 public int Foo 
 {
    get { return _foo; } // no setter
 }

 public void Poop(); // this member also not part of interface

सेटर इंटरफ़ेस का हिस्सा नहीं है, इसलिए इसे आपके इंटरफ़ेस के माध्यम से नहीं बुलाया जा सकता है:

 IBar bar = new Bar();
 bar.Foo = 42; // will not work thus setter is not defined in interface
 bar.Poop(); // will not work thus Poop is not defined in interface
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.