2010-04-19 11 views
48

स्पष्ट रूप से कार्यान्वित करते समय मुझे interface स्पष्ट रूप से कार्यान्वित करने के लिए कक्षा पर public विधि बनाने के दौरान यह त्रुटि मिल रही है। मेरे पास एक कार्यवाही है: PrintName विधि के स्पष्ट कार्यान्वयन को हटाकर। लेकिन मुझे आश्चर्य है कि मुझे यह त्रुटि क्यों मिल रही है।संकलन त्रुटि: "संशोधक 'सार्वजनिक' इस आइटम के लिए मान्य नहीं है" जबकि इंटरफ़ेस

क्या कोई भी त्रुटि समझा सकता है? लाइब्रेरी के लिए

कोड:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Test.Lib1 
{ 

    public class Customer : i1 
    { 
     public string i1.PrintName() //Error Here... 
     { 
      return this.GetType().Name + " called from interface i1"; 
     } 
    } 

    public interface i1 
    { 
     string PrintName(); 
    } 

    interface i2 
    { 
     string PrintName(); 
    } 
} 

कंसोल के लिए कोड का परीक्षण आवेदन:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Test.Lib1; 

namespace ca1.Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Customer customer = new Customer(); 
      Console.WriteLine(customer.PrintName()); 

      //i1 i1o = new Customer(); 
      //Console.WriteLine(i1o.printname()); 

      //i2 i2o = new Customer(); 
      //Console.WriteLine(i2o.printname()); 

     } 
    } 
} 

उत्तर

61

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

इसी तरह, इंटरफ़ेस में, सभी सदस्य सार्वजनिक हैं। यदि आप किसी इंटरफ़ेस के अंदर एक संशोधक जोड़ने का प्रयास करते हैं तो आपको एक ही त्रुटि मिल जाएगी।

स्पष्ट सदस्य (बहुत) निजी क्यों हैं? पर विचार करें:

interface I1 { void M(); } 
interface I2 { void M(); } 

class C : I1, I2 
{ 
    void I1.M() { ... } 
    void I2.M() { ... } 
} 

C c = new C(); 
c.M();   // Error, otherwise: which one? 
(c as I1).M(); // Ok, no ambiguity. 

तो उन तरीकों सार्वजनिक थे, तो आप एक नाम-संघर्ष कि सामान्य अधिभार नियमों से हल नहीं किया जा सकता है के लिए होगा।

इसी कारण से आप सदस्य के अंदर से M() पर भी कॉल नहीं कर सकते हैं। आपको एक ही अस्पष्टता से बचने के लिए पहले एक विशिष्ट इंटरफेस में this डालना होगा।

class C : I1, I2 
{ 
    ... 
    void X() 
    { 
    M();    // error, which one? 
    ((I1)this).M(); // OK 
    } 
} 
+1

(सी 1 के रूप में) एम।(); // कोई समस्या नहीं यह सही है, लेकिन अगर आप गधे के बाहर विधि एम तक पहुंचना चाहते हैं, तो यह सुलभ नहीं है? – Lalit

+0

@ ललित, यह हर जगह सुलभ है I1 सुलभ है। अन्य विधानसभाओं में भी। –

+0

इंटरफ़ेस I1 आक्रामक रूप से बाहर पहुंच योग्य है लेकिन कक्षा सी के लिए विधि एम बाहरी पहुंच योग्य नहीं है, क्लास ब्राउज़र की जांच करें और साथ ही इसे निजी के रूप में चिह्नित किया गया है। – Lalit

6

आप जब स्पष्ट रूप से इंटरफेस को लागू करने पहुँच संशोधक का उपयोग नहीं कर सकते हैं। सदस्य को किसी भी तरह से इंटरफ़ेस से जोड़ा जाएगा, इसलिए एक्सेस संशोधक को निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि सभी इंटरफ़ेस सदस्य हमेशा सार्वजनिक होते हैं, सभी स्पष्ट रूप से कार्यान्वित सदस्यों को केवल इंटरफ़ेस प्रकार के सदस्य के माध्यम से एक्सेस किया जा सकता है (उदाहरण के लिए statichippo का उत्तर देखें)।

+0

"यह एक संशोधित इंटरफ़ेस सदस्य कार्यान्वयन के लिए एक संशोधित समय त्रुटि है जो एक्सेस संशोधक को शामिल करने के लिए है, और यह संशोधक समय, वर्चुअल, ओवरराइड, या स्थैतिक शामिल करने के लिए एक संकलित-समय त्रुटि है।" प्रासंगिक दस्तावेज (http://msdn.microsoft.com/en-us/library/aa664591%28v=VS.71%29.aspx)। – R0MANARMY

12

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx: जब कोई सदस्य स्पष्ट रूप से कार्यान्वित किया जाता है, तो इसे क्लास इंस्टेंस के माध्यम से एक्सेस नहीं किया जा सकता है, लेकिन केवल इंटरफ़ेस के उदाहरण के माध्यम से।

Customer customer = new Customer(); 

Console.WriteLine(customer.PrintName());

का उल्लंघन इस

-2

जब हम उपरोक्त उदाहरण के लिए निहित कार्यान्वयन के साथ जाना चाहते हैं, तो कोड होगा।

interface I1 { void M(); } 
interface I2 { void M(); } 

class C : I1, I2 
{ 
    public void M() { ... } 
} 

C c = new C(); 
c.M(); // Ok, no ambiguity. Because both Interfaces gets implemented with one method definition. 
-1

यह एक स्पष्ट कार्यान्वयन, इंटरफ़ेस के सदस्यों के लिए डिफ़ॉल्ट गुंजाइश, सार्वजनिक है, जबकि यह एक वर्ग, Ergo के मामले में निजी है, लोक संशोधक का उपयोग करने की आवश्यकता नहीं है क्योंकि जब हम कहते हैं उस विधि को केवल इंटरफ़ेस के संदर्भ के साथ बुलाया जाएगा।

"MSDN Explicit Interface Implementation" के अनुसार स्पष्ट इंटरफेस को लागू करने वाले कार्यों को स्पष्ट रूप से स्पष्ट रूप से परिभाषित नहीं किया जाता है।वे डिफ़ॉल्ट रूप से सार्वजनिक हैं। अन्यथा उन्हें परिभाषित करना अर्थहीन होगा।

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