2012-02-08 20 views
15

में कार्यान्वित करें मेरे पास इंटरफेस को लागू करने के लिए वीएस -2010 में दो विकल्प हैं।अंतरफलक बनाम कार्यान्वयन इंटरफ़ेस को स्पष्ट रूप से सी #

enter image description here

इस प्रकार जब मैं IHelper.cs इंटरफेस है:

IEnumerable<IPort> IHelper.Ports 
    { 
     get 
     { 
      ... 
     } 
    } 

और, "इंटरफ़ेस को लागू" मुझे देता है:

public interface IHelper 
    .... 
    IEnumerable<IPort> Ports { get; } 

"स्पष्ट रूप से इंटरफ़ेस को लागू" इस कोड को देता है यह कोड:

public IEnumerable<IPort> Ports 
    { 
     get 
     { 
      ... 
     } 
    } 

क्या वे समान हैं या अलग हैं? सी # में इंटरफेस को लागू करने में मेरे पास दो विकल्प क्यों हैं?

+0

क्या "सार्वजनिक इंटरफेस लागू करना" और "निजी इंटरफेस लागू करना" बहुत कठिन रहा है? – PRMan

उत्तर

24

स्पष्ट इंटरफ़ेस घोषणाओं का अर्थ है कि इंटरफ़ेस सदस्य इंटरफ़ेस के अलावा अन्य प्रकारों पर उपलब्ध नहीं हैं, इसलिए कार्यान्वयन प्रकारों को सार्वजनिक रूप से एक्सेस करने से पहले इंटरफ़ेस में डालना होगा।

लागू, मानक तरीका जिसमें अधिकांश इंटरफेस लागू किए जाते हैं, कार्यान्वयनकर्ता के प्रकार के सार्वजनिक एपीआई पर इंटरफेस आइटम का खुलासा करते हैं।

मुख्य कारण स्पष्ट इंटरफेस परिभाषा के लिए अगर आप दो इंटरफेस है कि एक ही हस्ताक्षर के साथ पद्धतियां हैं लागू करने के लिए होता है संघर्ष के नामकरण से बचने के लिए है ... स्पष्ट परिभाषा हस्ताक्षर को हल करने के लिए पर्याप्त अलग रखने के लिए संकलक अनुमति देता है।

टिप्पणियों में XenoPuTtS द्वारा सुझाए गए कोड रखरखाव का समर्थन करने वाला एक माध्यमिक कारण यह है कि विधि परिभाषा हटा दिए जाने पर स्पष्ट परिभाषा कार्यान्वयन प्रकारों पर कंपाइलर त्रुटियों को ट्रिगर करेगी। अंतर्निहित कार्यान्वयन पर, इंटरफ़ेस से एक विधि को हटाने से विधि को किसी भी प्रकार के नियमित सदस्य के रूप में छोड़ दिया जाएगा - जिसका अर्थ है कि आपको अब-निष्क्रिय विधि कार्यान्वयन के लिए मैन्युअल रूप से खोजना होगा।

+2

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

+0

@XenoPuTtSs अच्छा बिंदु, मैंने इसे शामिल करने के लिए अपने उत्तर में संशोधन किया है। –

5

एक कक्षा जो इंटरफ़ेस लागू करती है वह स्पष्ट रूप से उस इंटरफ़ेस के सदस्य को कार्यान्वित कर सकती है। जब कोई सदस्य स्पष्ट रूप से कार्यान्वित किया जाता है, तो उसे कक्षा के उदाहरण के माध्यम से एक्सेस नहीं किया जा सकता है, लेकिन केवल इंटरफ़ेस के उदाहरण के माध्यम से।

// explicit1.cs 
interface IDimensions 
{ 
    float Length(); 
    float Width(); 
} 

class Box : IDimensions 
{ 
    float lengthInches; 
    float widthInches; 

public Box(float length, float width) 
{ 
    lengthInches = length; 
    widthInches = width; 
} 
// Explicit interface member implementation: 
float IDimensions.Length() 
{ 
    return lengthInches; 
} 
// Explicit interface member implementation: 
float IDimensions.Width() 
{ 
    return widthInches;  
} 

public static void Main() 
{ 
    // Declare a class instance "myBox": 
    Box myBox = new Box(30.0f, 20.0f); 
    // Declare an interface instance "myDimensions": 
    IDimensions myDimensions = (IDimensions) myBox; 
    // Print out the dimensions of the box: 
    /* The following commented lines would produce compilation 
    errors because they try to access an explicitly implemented 
    interface member from a class instance:     */ 
    //System.Console.WriteLine("Length: {0}", myBox.Length()); 
    //System.Console.WriteLine("Width: {0}", myBox.Width()); 
    /* Print out the dimensions of the box by calling the methods 
    from an instance of the interface:       */ 
    System.Console.WriteLine("Length: {0}", myDimensions.Length()); 
    System.Console.WriteLine("Width: {0}", myDimensions.Width()); 
} 
} 

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

// explicit2.cs 
// Declare the English units interface: 
interface IEnglishDimensions 
{ 
    float Length(); 
    float Width(); 
} 
// Declare the metric units interface: 
interface IMetricDimensions 
{ 
    float Length(); 
    float Width(); 
} 
// Declare the "Box" class that implements the two interfaces: 
// IEnglishDimensions and IMetricDimensions: 
class Box : IEnglishDimensions, IMetricDimensions 
{ 
    float lengthInches; 
    float widthInches; 
public Box(float length, float width) 
    { 
    lengthInches = length; 
    widthInches = width; 
    } 
// Explicitly implement the members of IEnglishDimensions: 
float IEnglishDimensions.Length() 
{ 
    return lengthInches; 
} 
float IEnglishDimensions.Width() 
{ 
    return widthInches;  
} 
// Explicitly implement the members of IMetricDimensions: 
float IMetricDimensions.Length() 
{ 
    return lengthInches * 2.54f; 
} 
float IMetricDimensions.Width() 
{ 
    return widthInches * 2.54f; 
} 
public static void Main() 
{ 
    // Declare a class instance "myBox": 
    Box myBox = new Box(30.0f, 20.0f); 
    // Declare an instance of the English units interface: 
    IEnglishDimensions eDimensions = (IEnglishDimensions) myBox; 
    // Declare an instance of the metric units interface: 
    IMetricDimensions mDimensions = (IMetricDimensions) myBox; 
    // Print dimensions in English units: 
    System.Console.WriteLine("Length(in): {0}", eDimensions.Length()); 
    System.Console.WriteLine("Width (in): {0}", eDimensions.Width()); 
    // Print dimensions in metric units: 
    System.Console.WriteLine("Length(cm): {0}", mDimensions.Length()); 
    System.Console.WriteLine("Width (cm): {0}", mDimensions.Width()); 
} 
} 

अधिक जानकारी के लिए पर

नज़र इस article

+1

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

+0

हाँ मैं तुम्हारे साथ परेशान हूं। – Serghei

6

को देखो वे पूरी तरह से अलग कर रहे हैं। यदि आप इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित करते हैं तो आप केवल उस इंटरफ़ेस के संदर्भ में इंटरफ़ेस सदस्यों को संदर्भित करने में सक्षम होंगे। निम्नलिखित कोड विचार प्रदर्शित करता है।

public interface IFoo { 
    String Bar { get; set; } 
} 
public class ImplicitFoo : IFoo { 
    public string Bar {get;set;} 
} 
public class ExplicitFoo : IFoo { 
    private String _Bar; 
    string IFoo.Bar { 
     get { 
      return _Bar; 
     } 
     set { 
      _Bar = value; 
     } 
    } 
} 
public class Test { 
    public void Test() { 
     var iml = new ImplicitFoo(); 
     // Works fine 
     Console.WriteLine(iml.Bar); 
     var expl = new ExplicitFoo(); 
     var fooInterface = (IFoo)expl; 
     // Works fine 
     Console.WriteLine(fooInterface.Bar); 
     // Throws compile time exception 
     Console.WriteLine(expl.Bar); 
    } 
} 
संबंधित मुद्दे