में सबसे अच्छा आंशिक इंटरफ़ेस कार्यान्वयन। नेट बेस कक्षाओं में आंशिक इंटरफ़ेस कार्यान्वयन की अनुमति नहीं देता है। एक शमन के रूप में मैं 3 वैकल्पिक समाधान आया हूँ। कृपया मुझे यह तय करने में सहायता करें कि रिफैक्टरिंग, संकलन/रन टाइम त्रुटियों, पठनीयता के संदर्भ में कौन सा सार्वभौमिक है। लेकिन पहले कुछ टिप्पणियां।सी # बेस/अमूर्त वर्ग
- बेशक आप ऑब्जेक्ट पर ऑब्जेक्ट डाल सकते हैं और बिना किसी कंपाइलर चेतावनी के किसी भी विधि को कॉल कर सकते हैं। लेकिन यह तार्किक नहीं है, आप सामान्य रूप से ऐसा नहीं करेंगे। यह निर्माण रिफैक्टरिंग के परिणामस्वरूप नहीं होगा।
- मुझे अधिकतम अलगाव चाहिए। डायरेक्ट क्लास अनुबंध (सार्वजनिक विधियों और गुणों) को इंटरफ़ेस कार्यान्वयन के साथ अलग किया जाना चाहिए। मैं ऑब्जेक्ट इंटरैक्शन को अलग करने के लिए इंटरफेस का उपयोग करता हूं।
मेरे तुलना:
- BaseClass1/MyClass1:
- चोर: IFoo से प्रत्येक लागू नहीं किया विधि के लिए BaseClass1 में आभासी सार बनाने के लिए है।
- con: अतिरिक्त विधि लपेटें - रनटाइम पर मामूली उत्पादकता प्रभाव।
- BaseClass2/MyClass2:
- चोर: कोई संकलक चेतावनी MyClass2 में Method2 का कोई कार्यान्वयन है। इसके बजाय रनटाइम अपवाद। खराब यूनिट परीक्षण कवरेज के साथ रिफैक्टरिंग संभावित रूप से कोड को अस्थिर कर सकता है।
- con: बाल कक्षाओं से प्रत्यक्ष विधि कॉल को रोकने के लिए अतिरिक्त अप्रचलित निर्माण करना है।
- con: Method2 बेसक्लास 1 के लिए सार्वजनिक है इसलिए यह अब कक्षा अनुबंध का हिस्सा है। IFoo के माध्यम से प्रत्यक्ष कॉल को रोकने के लिए "अप्रचलित" निर्माण करना होगा।
- BaseClass3/MyClass3:
- समर्थक: (# 2 की तुलना में)। अधिक पठनीय। आप देखते हैं कि MyClass2.Method2 IFoo कार्यान्वयन है, न केवल कुछ ओवरराइड विधि।
public interface IFoo
{
void Method1();
void Method2();
}
public abstract class BaseClass1 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
void IFoo.Method2()
{
IFooMethod2();
}
protected abstract void IFooMethod2();
}
public class MyClass1 : BaseClass1
{
[Obsolete("Prohibited direct call from child classes. only inteface implementation")]
protected override void IFooMethod2()
{
//some implementation
}
}
public abstract class BaseClass2 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
[Obsolete("Prohibited direct call from child classes. only inteface implementation")]
public virtual void Method2()
{
throw new NotSupportedException();
}
}
public abstract class MyClass2 : BaseClass2
{
public override void Method2()
{
//some implementation
}
}
public abstract class BaseClass3 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
void IFoo.Method2()
{
throw new NotSupportedException();
}
}
public abstract class MyClass3 : BaseClass3, IFoo
{
void IFoo.Method2()
{
//some implementation
}
}
यह एक ** बहुत ** अजीब पैटर्न है जिसे आप कार्यान्वित करने का प्रयास कर रहे हैं। आपने कहा * "नेट नेट क्लास में आंशिक इंटरफ़ेस कार्यान्वयन की अनुमति नहीं देता है।" * - इसके लिए एक कारण है। क्लाइंट कोड की अपेक्षा कुछ ऐसा है जो ** इंटरफ़ेस लागू करता है **, आपको पता है, शायद ... ** इंटरफ़ेस को लागू करें **। पाठ्यक्रम के मामले में असमर्थित विधियों के लिए अपवाद फेंकना * बहुत * खराब कोड गंध है ... – Yuck
यक के साथ सहमत हैं। यदि आपके पास 'IFoo' प्रकार का चर है, तो आप वास्तव में उम्मीद करते हैं कि' IFoo' के सभी विधियां लागू और उपलब्ध हैं। इसके लिए इंटरफेस बनाए जाते हैं। – ken2k
केवल MyClass1 _must_ पूरी तरह कार्यान्वित इंटरफ़ेस। और यह करता है। समस्या यह है कि कई बच्चे वर्ग हैं (मैंने पहले इसका उल्लेख नहीं किया था), प्रत्येक को IFoo लागू करना होगा। बेस क्लास के बिना आपको विधि 1 कार्यान्वयन की प्रतिलिपि बनाना/पेस्ट करना होगा, जो कि सभी बाल वर्गों के बराबर है।यही वह है जिसे मैं टालने की कोशिश कर रहा हूं। लेकिन विधि वर्ग कार्यान्वयन बाल वर्गों में अलग है, इसलिए मेरे पास केवल एक वर्ग नहीं है जो विधि 1 और विधि 2 दोनों लागू करता है। – user1194528