C# इंटरफ़ेस में डिफ़ॉल्ट कार्यान्वयन से बचना


मैं C# में विभिन्न कक्षाओं में अतिरिक्त कार्यक्षमता को एकीकृत करने का एक तरीका ढूंढ रहा हूं। इंटरफ़ेस विधियों के लिए डिफ़ॉल्ट कार्यान्वयन पर ध्यान केंद्रित करना एक अच्छा विचार था।

निम्नलिखित वर्ग संरचना पर विचार करें:

क्लास ए क्लास बी, सी और डी के लिए आधार है।
कक्षा ई कक्षा एफ, जी और एच के लिए आधार है।
कक्षा O कक्षा P, Q और R के लिए आधार है।

इनमें से, वर्ग बी, एफ और पी को इंटरफ़ेस लागू करना होगा IDoableजिसमें एक विधि शामिल है X यह सभी कार्यान्वयन वर्गों में सुसंगत होना चाहिए।

यहां एक सरलीकृत उदाहरण दिया गया है:

सी#
public class A
{ }

public class B : A, IDoable
{ }

public class C : A
{ }

public class D : A
{ }

public class E
{ }

public class F : E, IDoable
{ }

public class G : E
{ }

public class H : E
{ }

public class O
{ }

public class P : O, IDoable
{ }

public class Q : O
{ }

public class R : O
{ }

public interface IDoable
{
    // Yuck, that smells. Default implementation.
    string X() => "I want to implement method X only once";
}

public class Test
{
    public void Run()
    {
        string bx = new B().X();
        string fx = new F().X();
        string px = new P().X();
        
        string result = bx == fx && bx == px ? "Same :)" : "Various :("; 
    }
}

हालाँकि, इस बात पर बहस चल रही है कि क्या C# में इंटरफ़ेस विधियों के लिए डिफ़ॉल्ट कार्यान्वयन का उपयोग करना उचित है। क्या डिफ़ॉल्ट कार्यान्वयन पर भरोसा किए बिना इस कार्यक्षमता को प्राप्त करने के लिए वैकल्पिक दृष्टिकोण हैं? या क्या इस परिदृश्य में डिफ़ॉल्ट कार्यान्वयन का उपयोग स्वीकार्य है?

नोट: ए, ई और ओ की कोई साझा विशेषताएँ नहीं हैं और वे संबंधित नहीं हैं।

मैंने क्या प्रयास किया है:

सबसे पहले, मैंने उल्लंघन से बचने के लिए एक्स को सीधे कक्षा बी, एफ और पी में लागू करने से परहेज किया सूखा सिद्धांत. यह देखते हुए कि X का अर्थ इन वर्गों में समान होना है, यह दृष्टिकोण अव्यावहारिक लगता है, खासकर यदि X लंबा है।

दूसरे, मैंने एक एक्सटेंशन विधि बनाई, जिसने एक्स कार्यक्षमता प्रदान करने के लिए अच्छा काम किया:

सी#
public static class DoableExtensions
{
    public static string X(this IDoable doable)
    {
        return "I want to implement method X only once";
    }
}

हालाँकि, इस दृष्टिकोण का परिणाम खाली रहा IDoable इंटरफ़ेस, जो इसका उल्लंघन करता है “CA1040: खाली इंटरफ़ेस से बचें” नियम।

अंत में, मैंने इस पर विचार किया डेकोरेटर पैटर्न, लेकिन मैं अनिश्चित हूं कि DRY सिद्धांत का अनुपालन बनाए रखते हुए इसे कुशलतापूर्वक कैसे कार्यान्वित किया जाए। लेकिन यह संभव है कि यह दृष्टिकोण ही मुख्य समाधान हो।

समाधान 1

प्रश्न को सैद्धांतिक रखने से स्थिति को जाने बिना ठोस उत्तर देना बहुत कठिन हो जाता है। ऐसा लगता है जैसे आपका शिक्षक, या किसी नौकरी के लिए साक्षात्कारकर्ता, आपको एक ऐसा प्रश्न देने का प्रयास कर रहा है जिसका कोई सही उत्तर नहीं है, यह देखने के लिए कि आप कैसे प्रतिक्रिया देंगे।

प्रस्तुत विकल्पों को देखते हुए, डेकोरेटर पैटर्न समाधान बताता है कि सभी 3 आधार वर्गों में एक सामान्य आधार वर्ग या इंटरफ़ेस है। तो एक विस्तार विधि के साथ खाली इंटरफ़ेस संभावित समाधान होगा। कारण: आप एक से अधिक ठोस (आधार/सार) वर्ग प्राप्त नहीं कर सकते हैं लेकिन आप एकाधिक (अंतर्निहित/स्पष्ट) इंटरफेस लागू कर सकते हैं।

コメント

タイトルとURLをコピーしました