2010-10-11 13 views
11

क्या कोई स्वचालित संपत्ति का उपयोग करके एक इंटरफेस को लागू करने का कोई तरीका है? उदाहरण के लिए, इस कोड पर विचार करें:स्वचालित संपत्ति का उपयोग कर एक इंटरफ़ेस का स्पष्ट कार्यान्वयन

namespace AutoProperties 
{ 
    interface IMyInterface 
    { 
     bool MyBoolOnlyGet { get; } 
    } 

    class MyClass : IMyInterface 
    { 
     static void Main(){} 

     public bool MyBoolOnlyGet { get; private set; } // line 1 
     //bool IMyInterface.MyBoolOnlyGet { get; private set; } // line 2 
    } 
} 

इस कोड को संकलित करता है। हालांकि, यदि आप लाइन 2 के साथ लाइन 1 को प्रतिस्थापित करते हैं तो यह संकलित नहीं होता है।

(यह है कि मैं लाइन प्राप्त करने के लिए 2 काम करने की जरूरत नहीं है - मैं तो बस उत्सुक हूँ।)

+0

कौन-सा त्रुटि आप मिलता है? –

+2

"क्यों" के लिए - खुद से पूछें ... मैं इसे कैसे असाइन करूं? –

+0

मुझे दो त्रुटियां मिलती हैं: 1. 'ऑटोप्रॉपर्टीज। MyClass.AutoProperties.IMyInterface.MyBoolOnlyGet.set' इंटरफ़ेस सदस्य 'AutoProperties.IMyInterface.MyBoolOnlyGet' में नहीं मिला एक एक्सेसर जोड़ता है। 2. संशोधक 'निजी' इस आइटम के लिए मान्य नहीं है – user181813

उत्तर

13

दरअसल, उस विशेष व्यवस्था (एक स्वचालित रूप से लागू किया संपत्ति से केवल-get इंटरफ़ेस संपत्ति का स्पष्ट कार्यान्वयन) 'isn भाषा द्वारा समर्थित टी। तो या तो इसे मैन्युअल रूप से (एक फ़ील्ड के साथ) करें, या एक निजी ऑटो-कार्यान्वित प्रोप, और प्रॉक्सी लिखें। लेकिन ईमानदारी से, जब तक आप यह कर लें तो आप भी एक क्षेत्र के लिए इस्तेमाल किया हो सकता है ...

private bool MyBool { get;set;} 
bool IMyInterface.MyBoolOnlyGet { get {return MyBool;} } 

या:

private bool myBool; 
bool IMyInterface.MyBoolOnlyGet { get {return myBool;} } 
5

समस्या इंटरफ़ेस केवल गेटर है कि और आप इसे गेटटर और सेटर के साथ स्पष्ट रूप से कार्यान्वित करने का प्रयास करते हैं।
जब आप स्पष्ट रूप से एक इंटरफ़ेस को कार्यान्वित करते हैं तो स्पष्ट कार्यान्वयन केवल तभी कॉल किया जाएगा जब आपका संदर्भ इंटरफ़ेस प्रकार का हो, तो ... यदि इंटरफ़ेस में केवल गेटटर है तो सेटटर का उपयोग करने का कोई तरीका नहीं है, इसलिए इसका कोई मतलब नहीं है वहाँ सेटर।

यह, उदाहरण के लिए संकलन होगा:

namespace AutoProperties 
    { 
     interface IMyInterface 
     { 
      bool MyBoolOnlyGet { get; set; } 
     } 

     class MyClass : IMyInterface 
     { 
      static void Main() { } 

      bool IMyInterface.MyBoolOnlyGet { get; set; } 
     } 
    } 
+0

मुझे यह नहीं समझा जाता है कि इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित करना क्यों लागू कार्यान्वयन से कहीं अधिक प्रतिबंधित होना चाहिए। शायद यह समझ में आता है कि सी # कंपाइलर में अंतर्निहित कार्यान्वयन के परिणाम स्वचालित रूप से आपके लिए आवश्यक स्पष्ट कार्यान्वयन कोड उत्पन्न करते हैं। क्या आप यहां तार्किक अंतर को पुल कर सकते हैं-जो ओपी के कोड को तोड़ने वाले स्पष्ट से बिल्कुल अलग है? – binki

+0

मान लीजिए कि आप एक स्पष्ट कार्यान्वयन में ऐसे निजी सेटटर को परिभाषित कर सकते थे। आप इसका इस्तेमाल कैसे करेंगे? 'this.setter = ...' निहित सेटटर को प्रस्तुत करेगा (क्योंकि यह माइक्लास प्रकार है) और '((IMyInterface) यह) .setter' विफल हो जाएगा क्योंकि IMyInterface में सेटटर परिभाषित नहीं है। –

+0

यह पूरा बिंदु है। अगर स्पष्ट रूप से कार्यान्वित संपत्ति ऑटो लागू की जा सकती है, तो मुझे इसके लिए अपने स्वयं के बैकिंग स्टोर को मैन्युअल रूप से लागू नहीं करना पड़ेगा। मैं अपने निजी सेटर को छिपाने के लिए केवल गेटटर को परिभाषित करने वाले इंटरफ़ेस पर भरोसा कर सकता हूं। खैर, मुझे लगता है कि इसमें समस्याएं हैं, लेकिन मेरे दिमाग में यह मूल रूप से एक ही समस्या है [केवल एक संपत्ति के सेटटर या गेटटर को ओवरराइड करने में असमर्थ] (http://stackoverflow.com/a/6058526/429091)। आपको संकलक को बताने में सक्षम होना चाहिए कि केवल आपका सेटटर या आपका गेटर स्पष्ट इंटरफेस को कार्यान्वित कर रहा है। – binki

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

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