कभी-कभी आप ऐसा इंटरफ़ेस लागू करना चाहते हैं जो इस तरह दिखता है:

public interface ITraversable<T> {

    List<T> Children { get; }

}

लेकिन कभी-कभी आपको इस तरह एक अलग संग्रह वर्ग की आवश्यकता होती है:

public interface ITraversable<T> {

    ObservableCollection<T> Children { get; }

}

लेकिन आप खुद को दोहराना नहीं चाहते हैं, इसलिए आप इस इंटरफ़ेस को आजमाएं:

public interface ITraversable<T> {

    IEnumerable<T> Children { get; }

}

लेकिन सूची या अवलोकन योग्य चयन का उपयोग करने वाले किसी भी कार्यान्वयन वर्ग को एक त्रुटि मिलेगी:

त्रुटि CS0738 'परीक्षक' इंटरफ़ेस सदस्य 'ITraversable.Children' को लागू नहीं करता है। 'परीक्षक.चिल्ड्रेन' 'ITraversable.Children' को लागू नहीं कर सकता क्योंकि इसमें 'IEnumerable' का मिलान रिटर्न प्रकार नहीं है।

क्या एक सामान्य इंटरफ़ेस संपत्ति के साथ एक एकल इंटरफ़ेस बनाना संभव है जिसका उपयोग कई ठोस वर्ग कार्यान्वयन द्वारा किया जा सकता है?

0
stricq 25 नवम्बर 2020, 10:49

2 जवाब

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

IEnumerable<T> आवश्यकता होने पर भी आप स्पष्ट इंटरफ़ेस कार्यान्वयन का उपयोग कर सकते हैं:

public interface ITraversable<T> {

    IEnumerable<T> Children { get; }

}

public class Implementer1<T>: ITraversable<T> {
    List<T> Children { get; }
    IEnumerable<T> ITraversable<T>.Children => Children;
}

public class Implementer2<T>: ITraversable<T> {
    ObservableCollection<T> Children { get; }
    IEnumerable<T> ITraversable<T>.Children => Children;
}

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

1
Sweeper 25 नवम्बर 2020, 11:01

यह एक ऐसा तरीका है जिसे मैंने एक सामान्य इंटरफ़ेस के साथ एक इंटरफ़ेस को लागू करने के लिए पाया है जिसे कई ठोस वर्गों द्वारा कार्यान्वित किया जा सकता है:

public interface ITraversable<T, out TEnumerable> where TEnumerable : IEnumerable<T> {

    TEnumerable Children { get; }

}

यह आपको विभिन्न वर्गों की अनुमति देता है जो IEnumerable के विभिन्न ठोस कार्यान्वयन का उपयोग करते हैं।

public class TestClass1 : ITraversable<TestClass1, List<TestClass1>> {

    public List<TestClass1> Children { get; }

}

public class TestClass2 : ITraversable<TestClass2, ObservableCollection<TestClass2>> {

    public ObservableCollection<TestClass2> Children { get; }

}

इंटरफ़ेस को लागू करते समय, प्रकारों को बिल्कुल मेल खाना चाहिए। यही कारण है कि आप IEnumerable को सूची से प्रतिस्थापित नहीं कर सकते क्योंकि वे एक ही प्रकार के नहीं हैं। हालांकि, यदि आप इंटरफ़ेस पर एक सामान्य पैरामीटर के रूप में सटीक प्रकार निर्दिष्ट करते हैं, तो आप सटीक प्रकार से मिलान कर सकते हैं।

0
stricq 25 नवम्बर 2020, 10:49