मुझे उस वर्ग का विस्तार करने की आवश्यकता है जहां बाल वर्ग मूल वर्ग के कुछ सदस्यों का उपयोग नहीं करेगा। अप्रयुक्त सदस्यों को कैसे संभाला जाना चाहिए और फिर भी खुले/बंद ठोस सिद्धांत का सम्मान करना चाहिए? मैं नीचे दिए गए कोड की तरह कुछ करने पर विचार कर रहा हूं, लेकिन प्रतिबिंब का उपयोग करने वाले मौजूदा कोड को अपवाद मिलेगा। यदि मैं बहिष्कृत सदस्यों में डेटा डालता हूं, तो मौजूदा कोड अप्रत्याशित परिणाम देगा।

मुझे लगता है कि शायद एक पूरी तरह से अलग दृष्टिकोण का इस्तेमाल किया जाना चाहिए। मौजूदा कोड को संशोधित किए बिना इस स्थिति को कैसे संभालें (जो खुले/बंद सिद्धांत का भी उल्लंघन करेगा)?

class Parent
{
    public virtual int myVarMin { get; set; } = 0;
    public virtual int myVarMax { get; set; } = 10;
    public int myVar { get; set; }
    public int unchanged1 {get; set;}
    //.
    //numerous other members that are irrelevant to the question
    //.
    public void doSomething(){/*do something*/}
    //
}

class Child:Parent
{
    //considered impementation from original question 
    public override int myVarMin => throw new NotSupportedException();
    public override int myVarMax => throw new NotSupportedException();
    public List<int> myVarList = new List<int>();
}

class MyExistingCode
{
    public void Display(Parent parent)
    {
        foreach (var info in parent.GetType().GetProperties())
        {
            Console.WriteLine($"{info.Name}: {info.GetValue(parent)}");
        }
    }
}
-3
Kevin S. Miller 29 जिंदा 2021, 17:08

2 जवाब

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

मैंने ऐसा कुछ किया (Parent और MyExistingCode कक्षाएं अपरिवर्तित थीं, इसलिए वे खुले/बंद सिद्धांत का अनुपालन करते हैं):

class Child : Parent
    {
        public new int? myVarMin => null;
        public new int? myVarMax => null;
        public List<int> myVarList = new List<int>();
    }

 class MyNewCode : MyExistingCode
    {
        public new void Display(Parent parent)
        {
            foreach (var info in parent.GetType().GetProperties())
            {
                Console.WriteLine($"{info.Name}: {info.GetValue(parent) ?? "NULL"}");
            }
        }
    }

मुझे आश्चर्य हुआ कि मैं एक int को बिना किसी त्रुटि के int? के साथ छिपा सकता था। बेहतर होने पर मैं एक और जवाब स्वीकार करूंगा।

-1
Kevin S. Miller 29 जिंदा 2021, 22:13

डेवलपर को सूचित करने के लिए Obsolete विशेषता का उपयोग करें कि आपकी विधि बहिष्कृत है और उन्हें नए संस्करण का उपयोग करना चाहिए।

[Obsolete("Method is deprecated, use Method2 please.")]
public void Method()
{ 
    … 
}

यहां मैंने आपका कोड बदल दिया है, इसलिए प्रतिबिंब का उपयोग करके आप यह पता लगा सकते हैं कि कोई विधि/संपत्ति बहिष्कृत है या नहीं, और यह अब अपवाद नहीं फेंकेगा।

    public class Parent
    {
        public virtual int myVarMin { get; set; } = 0;
        public virtual int myVarMax { get; set; } = 10;
        public int myVar { get; set; }
    }

    public class Child : Parent
    {
        [Obsolete("Use other property")]
        public override int myVarMin => throw new NotSupportedException();
        [Obsolete("Use other property")]
        public override int myVarMax => throw new NotSupportedException();
        public List<int> myVarList = new List<int>();
    }

    class MyExistingCode
    {
        public void Display(Parent parent)
        {
            foreach (var info in parent.GetType().GetProperties())
            {
                var customeAttributes = (ObsoleteAttribute[])info.GetCustomAttributes(typeof(ObsoleteAttribute), false);
                if (customeAttributes.Length > 0)
                {
                    Console.WriteLine($"{info.Name} is deprecated.");
                }
                else
                {
                    Console.WriteLine($"{info.Name}: {info.GetValue(parent)}");
                }
            }
        }
    }
0
Saeed Aghdam 29 जिंदा 2021, 17:42