2009-04-27 14 views
43

कुछ समय पहले एक .NET स्थिति के लिए एक साक्षात्कार में साक्षात्कारकर्ता ने मुझसे पूछा, "आप किस के लिए एक निजी इंटरफेस का उपयोग करेंगे?"।एक निजी इंटरफ़ेस क्या है?

मैंने उनसे पूछा कि क्या उनका मतलब अंतर्निहित बनाम स्पष्ट इंटरफ़ेस कार्यान्वयन के बीच का अंतर है जिसके लिए उन्होंने उत्तर दिया।

तो मैं सोच रहा हूँ:

  1. वह क्या मतलब था?
  2. आप किस के लिए एक निजी इंटरफेस का उपयोग करेंगे?

उत्तर

30

एक इंटरफेस अन्य वर्ग

public class MyClass 
{ 
    private interface IFoo 
    { 
     int MyProp { get; } 
    } 

    private class Foo : IFoo 
    { 
     public int MyProp { get; set; } 
    } 

    public static void Main(string[] args) 
    { 
     IFoo foo = new Foo(); 
     return foo.MyProp; 
    } 
} 

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

Explicit interface implementation एक अलग मामला है, कुछ उपयोगी मामले हैं (विशेष रूप से जब जेनेरिक और पुराने गैर सामान्य इंटरफेस के साथ काम करते हैं) लेकिन मैं इसे 'निजी इंटरफेस' नहीं कहूंगा और यह नहीं कहूंगा कि इस शब्द का सामान्य रूप से उपयोग किया जाता है ।

दो तकनीकों एक साथ कर सकते हैं का उपयोग आप करते हैं: क्या आप कुछ फैशन में नेस्टेड कक्षाओं का पर्दाफाश करने के

public class MyClass 
{ 
    private interface IFoo 
    { 
     int MyProp { get; } 
    } 

    public class Foo : IFoo 
    { 
     int IFoo.MyProp { get; set; } 
    } 

    public static void Main(string[] args) 
    { 
     IFoo foo = new Foo(); 
     return foo.MyProp; 
    } 
} 

public class HiddenFromMe 
{ 
    public static void Main(string[] args) 
    { 
     MyClass.Foo foo = new MyClass.Foo(); 
     return foo.MyProp; // fails to compile 
    } 
} 

यह अनुमति देता है, जबकि माता-पिता वर्ग आह्वान करने के लिए उन पर तरीकों कि बाहर की दुनिया नहीं कर सकते हैं अनुमति देता है। यह एक संभावित उपयोगी मामला है लेकिन ऐसा कुछ नहीं है जिसे मैं अक्सर उपयोग करना चाहता हूं। निश्चित रूप से इसका उपयोग साक्षात्कारकर्ता द्वारा उपयोग किए जाने वाले एक सीमा मामले होने के साक्षात्कार में किया जाता है क्योंकि उन्होंने इसे देखा है और हालांकि यह 'दिलचस्प'

+5

हालांकि यह सच है, क्या यह इंटरफेस के सबसे बेकार उपयोगों में से एक नहीं होगा? मैं नहीं देख सकता कि आप कभी भी इस तरह के निर्माण का उपयोग क्यों करेंगे। – Razzie

+0

उस के लिए उपयोग के मामले के बारे में सोचने के लिए संघर्ष कर रहा है, या कम से कम एक उपयोग केस जिसमें भगवान वर्ग – annakata

+0

भी शामिल नहीं है, यही वह सवाल है जिसे मैंने अर्थ के रूप में व्याख्या किया, इस मामले में यह सिर्फ एक मूर्ख सवाल था साक्षात्कारकर्ता ने पूछा! – RichardOD

11

this link से।

निजी इंटरफ़ेस विरासत

ऐतिहासिक रूप से, भाषाओं निजी वंशानुक्रम की अनुमति दी है। सी ++ में, आप उस प्रकार के साथ बहुरूप रूप से संगत होने के बिना किसी प्रकार से प्राप्त कर सकते हैं। यह कार्यान्वयन का पुन: उपयोग करने का एक सुविधाजनक तरीका है। सीटीएस में, आप निजी कार्यान्वयन विरासत नहीं कर सकते हैं। लेकिन आप निजी इंटरफेस विरासत का उपयोग कर सकते हैं।

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

class PrivateImplementer : IFoo 
{ 
    void IFoo.Foo() 
    { 
     Console.WriteLine("PrivateImplementer::IFoo.Foo"); 
    } 
} 

, PrivateImplementer सार्वजनिक रूप से IFoo लागू करने के लिए जाना जाता है। इस प्रकार, IFoo के उदाहरण के रूप में एक उदाहरण को बहुरूप रूप से माना जा सकता है। लेकिन आप वास्तव में उस पर फू को कॉल नहीं कर सकते हैं जब तक कि आप इसे IFoo के रूप में नहीं मानते। यह कोड यह दर्शाता है:

PrivateImplementer p = new PrivateImplementer(); 
p.Foo(); // This line will fail to compile 
IFoo f = p; 
f.Foo(); 

आप निजी रूप से कार्यान्वित करने के लिए इंटरफ़ेस के अलग-अलग तरीकों का चयन कर सकते हैं। उदाहरण के लिए, यदि PrivateImplementerIFooBar लागू किया गया है, तो यह निजी रूप से Foo को लागू करने का विकल्प चुन सकता है, लेकिन बार सामान्य रूप से सामान्य वाक्यविन्यास का उपयोग कर बार चुन सकता है।

प्रैक्टिस में, ऐसे कई सामान्य मामले नहीं हैं जहां आप निजी कार्यान्वयन का उपयोग करेंगे। System.Collections.Generic लाइब्रेरी सभी विरासत प्रणाली को गुप्त रूप से कार्यान्वित करने के लिए इस दृष्टिकोण का उपयोग करती है। चयन कमजोर टाइप किए गए इंटरफेस। यह पीछे की संगतता "बस काम करता है" उदाहरण के लिए List<T> का एक उदाहरण है जो IList अपेक्षा करता है कि ठीक काम करेगा। इस विशिष्ट उदाहरण में, नए प्रकार के एपीआई को अव्यवस्थित करना एक दयालुता होगी (कमजोर टाइप की गई इंटरऑपरेबिलिटी के लिए आवश्यक कुछ विधियां हैं)।

"नहीं," एक बहुत ही खराब जवाब है यदि वह यह जानना चाहता था कि आप क्या जानते थे। किसी ऐसे व्यक्ति की तरह लगता है जो सिर्फ यह दिखाना चाहता है कि उन्हें कितना पता है।

+2

हाय मार्क, मैंने देखा कि वेबपृष्ठ भी- क्या यह एक स्पष्ट इंटरफ़ेस कार्यान्वयन के समान नहीं है? – RichardOD

+1

मैं इसे +1 करने जा रहा हूं क्योंकि इसे निजी इंटरफ़ेस विरासत के रूप में जाना जाता है। – annakata

+6

यह स्पष्ट इंटरफ़ेस कार्यान्वयन है और साक्षात्कारकर्ता ने कहा कि वह उसका मतलब नहीं था। – GrahamS

1

बस एक आंतरिक वर्ग (जो भी निजी है) की तरह आप एक निजी इंटरफ़ेस का उपयोग कर सकते हैं एक मौजूदा वर्ग में।

1

मैं थोड़ी देर के लिए googled और this आलेख पाया कि कैसे विभिन्न इंटरफेस विभिन्न ग्राहकों को विभिन्न इंटरफेस प्रदान करने के लिए इस्तेमाल किया जा सकता है। यह सी ++ कहानी है।

मुझे नहीं लगता कि इसे सी # थो पर लागू किया जा सकता है, क्योंकि एक ही प्रभाव आईएमओ स्पष्ट इंटरफ़ेस और क्लाइंट के साथ हासिल किया जा सकता है जो मेजबान को उचित इंटरफ़ेस में डाला जाता है।

हो सकता है कि किसी और को कुछ मैं वहाँ याद किया देख सकते हैं ....

मैं भी MSDN पर इस पाया:

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

2

ShuggyCoUk अच्छा जवाब देता है, लेकिन इस तरह के टिप्पणी

साथ यह एक संभावित रूप से उपयोगी मामला है लेकिन कुछ मैं बहुत बार उपयोग करना चाहते हैं हैं नहीं है। निश्चित रूप से यह एक साक्षात्कार में उपयोग एक सीमा मामले क्योंकि वे इसे देखा है साक्षात्कारकर्ता उपयोग कर रहा है जा रहा है की बू आती है और यद्यपि यह 'दिलचस्प'

मैं, कहने के लिए चाहिए था, यह निश्चित रूप से केवल स्मार्ट साक्षात्कारकर्ताओं के लिए क्षमता नहीं है।

यहां Realization of Full State Machine (FSM) with inheritance and unitest support है, जो निजी/संरक्षित इंटरफेस उपयोग का अच्छा उदाहरण है।

यह प्रश्न What is the C# equivalent of friend? और Why does C# not provide the C++ style 'friend' keyword? और वास्तव में, आपके प्रश्न पर भी एक उत्तर था।

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