जब मेरे पास एक सार्वजनिक इंटरफ़ेस है

public interface IPub { string Foo { get; set; } }

तो मैं इस इंटरफ़ेस को या तो इसे स्पष्ट रूप से कार्यान्वित कर सकता हूं:

public class CFoo : IPub { string IPub.Foo { get; set; } }

या परोक्ष रूप से public संशोधक का उपयोग करके:

public class CFoo : IPub { public string Foo { get; set; } }

. समझ में आता है: संशोधक public होना चाहिए क्योंकि इंटरफ़ेस public है।

लेकिन जब मेरे पास एक आंतरिक इंटरफ़ेस होता है

internal interface IInt { string Bar { get; set; } }

तो मैं इसे केवल स्पष्ट रूप से कार्यान्वित कर सकता हूं:

public class CBar : IInt { string IInt.Bar { get; set; } }

या परोक्ष रूप से public संशोधक के साथ:

public class CBar : IInt { public string Bar { get; set; } }

, लेकिन internal संशोधक के साथ नहीं:

public class CBar : IInt { internal string Bar { get; set; } }
// compiler error:
//     'CBar' does not implement interface member 'IInt.Bar'.
//     'CBar.Bar' cannot implement an interface member
//      because it is not public.

इसका कोई मतलब नहीं है। जब इंटरफ़ेस केवल internal है, तो मुझे public संशोधक की आवश्यकता क्यों है? क्या कोई तकनीकी कारण हैं कि क्यों public को हमेशा अंतर्निहित इंटरफ़ेस कार्यान्वयन में उपयोग किया जाना चाहिए, या क्या C# डेवलपर्स ने इसे अलग तरीके से बनाया है (भाषा में बहुत सी चीजों को बदलने की आवश्यकता के बिना)?

3
Kjara 7 पद 2018, 13:28

1 उत्तर

सबसे बढ़िया उत्तर

संशोधक सार्वजनिक होना चाहिए क्योंकि इंटरफ़ेस सार्वजनिक है।

जबकि यह निर्धारित करने का a तरीका होता: यह वह नहीं है जो संकलक चाहता है। अंतर्निहित इंटरफ़ेस कार्यान्वयन के लिए (इंटरफ़ेस प्रकार की दृश्यता की परवाह किए बिना), एक सदस्य को public, कोई "ifs", "buts" या "maybes" (कार्यान्वयन प्रकार) के रूप में घोषित किया जाना चाहिए। , हालांकि, कोई भी दृश्यता स्तर हो सकता है)

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


विशेष रूप से, यह विनिर्देश (v5) में §18.6.5 ("इंटरफ़ेस मैपिंग") है - जोर मेरा ("I" = इंटरफ़ेस प्रकार, "M" = सदस्य, "S" = कार्यान्वयन प्रकार):

  • यदि S में I और M से मेल खाने वाले स्पष्ट इंटरफ़ेस सदस्य कार्यान्वयन की घोषणा शामिल है, तो यह सदस्य I.M. का कार्यान्वयन है
  • अन्यथा, यदि S में एक गैर-स्थिर सार्वजनिक सदस्य की घोषणा शामिल है जो M से मेल खाती है, तो यह सदस्य आईएम का कार्यान्वयन है यदि एक से अधिक सदस्य मेल खाते हैं, तो यह निर्दिष्ट नहीं है कि कौन सा सदस्य है आईएम का कार्यान्वयन यह स्थिति केवल तभी हो सकती है जब एस एक निर्मित प्रकार है जहां दो सामान्य प्रकार में घोषित सदस्यों के अलग-अलग हस्ताक्षर होते हैं, लेकिन प्रकार के तर्क उनके हस्ताक्षर समान।
6
Marc Gravell 7 पद 2018, 10:43