C # क्लास से इंटरफ़ेस में नहीं बदल सकता [डुप्लिकेट]

Dec 14 2020

मैं इंटरफेस का उपयोग करने के लिए नया हूं, लेकिन इस पर पढ़ने के बाद, मुझे लगा कि इंटरफेस का विचार यह था कि इंटरफ़ेस से प्राप्त एक वर्ग को कहीं भी स्वीकार किया जाएगा इंटरफ़ेस को स्वीकार किया गया था। यहाँ मेरा कोड है:

public interface IPersonOfInterest
{ 
    //code requiring certain info to exist
}    
public abstract class PersonOfInterest
{
    public string[] GetBigPersonsInfo(List<IPersonOfInterest> FromList)
    {
        //code to gather a list of info that is guaranteed to be in any IPersonOfInterest
        return new string[] { };
    }
}

public class BigDonors : PersonOfInterest, IPersonOfInterest
{
    public List<BigDonors> SuchDonors = new List<BigDonors>();
    public void GimmeDemInfos()
    {
        string[] GetInfo = GetBigPersonsInfo(SuchDonors); //<-- compiler error here
    }
}

जैसा कि आप देख सकते हैं, इंटरफ़ेस BigDonorsसे लिया गया IPersonOfInterestहै। तो यह एक संकलक त्रुटि क्यों देता है, यह कहते हुए कि सूची BigDonorको सूची में परिवर्तित नहीं किया जा सकता है IPersonOfInterest? मैं समझता हूं कि वे एक ही चीज नहीं हैं। मुझे लगता है कि मुझे पता है कि मैं यहां क्या करने की कोशिश कर रहा हूं, लेकिन यह मुझे ऐसा करने नहीं दे रहा है।

संपादित करें: मेरा प्रश्न जल्दी से पहले से ही उत्तर के रूप में चिह्नित किया गया था, हालांकि, प्रदान किया गया उत्तर केवल समस्या की व्याख्या करता है लेकिन वास्तव में समाधान नहीं देता है। इसलिए मैं इस प्रश्न को अपने हल के साथ संपादित कर रहा हूं:

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

public interface IPersonOfInterest
{ 
    //code requiring certain info to exist
}    
public virtual class PersonOfInterest : IPersonOfInterest
{
    //Changed to IReadOnlyList<IPersonOfInterest>, instead of List<IPersonOfInterest>:
    public string[] GetBigPersonsInfo(IReadOnlyList<IPersonOfInterest> FromList)
    {
        return new string[] { };
    }
}

public class BigDonors : PersonOfInterest
{
    public List<BigDonor> SuchDonors = new List<BigDonor>();    
    public void GimmeDemInfos()
    {
        //Added .AsReadOnly(), and it now compiles:
        string[] GetInfo = GetBigPersonsInfo(SuchDonors.AsReadOnly());
    }
}

जवाब

LajosArpad Dec 14 2020 at 07:08

आपने इंटरफेस के उद्देश्य की सही पहचान की है। आपको उपयोग करने की आवश्यकता है List<IPersonOfInterest>, क्योंकि यह विवरण का अनुपालन करता है।

संक्षेप में

BigDonorविरासत में मिला है IPersonOfInterest, लेकिन विरासत List<BigDonor>में नहीं मिला है List<IPersonOfInterest>। इसका मतलब है कि आपको पास होने की आवश्यकता होगी List<IPersonOfInterest>, लेकिन आपके पास BigDonorउस सूची में तत्वों को जोड़ने का अवसर होगा ।