मेरे पास दो अलग-अलग प्रकार के तार हैं जो मैं चारों ओर गुजर रहा हूं और अपने कोड में उपयोग कर रहा हूं, और दोनों निकट से संबंधित हैं, लेकिन एक दूसरे के लिए भ्रमित नहीं होना चाहिए। मैंने सोचा कि मैं खुद को दो वर्गों के साथ त्रुटियों से बचने में मदद कर सकता हूं, लेकिन अलग-अलग नामों के साथ ताकि विधि हस्ताक्षर (और सामान्य रूप से असंगतता टाइप करें) दो अलग-अलग प्रकार के तारों के अर्थपूर्ण अर्थ को लागू करे। उसी समय, मैं सौ स्थानों में something = "foo";
से something.Value = "foo";
से रिफैक्टर करना नहीं चाहता था।मैं व्युत्पन्न "खोल" कक्षाओं को कैसे घोषित कर सकता हूं जो कुछ भी नहीं बल्कि नाम के रूप में कार्य करता है?
पहले सोचा:
private class FirstKind : string { }
private class SecondKind : string { }
विचार किया जा रहा है कि अगर मैं
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
है, और फिर MyMethod(secondKindVar, firstKindVar);
से कॉल करने की कोशिश करते हैं, मैं एक संकलक त्रुटि मिलती होगी।
वॉल I हिट: string
सील कर दिया गया है।
दूसरा विचार: जेनेरिक KindOf<T>
कक्षा बनाएं जो कुछ भी नहीं करेगी लेकिन अंतर्निहित रूपांतरण ऑपरेटरों के साथ मूल्य को बाहर निकालेगी। इस तरह:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}
इस तरह से मैं कुछ इस तरह कर सकता है:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
दीवार मुझे मारा:, न तो कंस्ट्रक्टर्स और न ही ऑपरेटरों व्युत्पन्न प्रकार में मौजूद है जिसका अर्थ है: KindOf<T>
वर्ग से कुछ भी नहीं वारिस करने लगता है मुझे व्युत्पन्न कक्षाओं में अनिवार्य रूप से संपूर्ण आधार वर्ग को फिर से लागू करना होगा। कोड कॉपीिंग। छी।
तो मुझे लगता है कि मुझे यहां कुछ बुनियादी याद आ रही है, और शायद मैं खरपतवार में बंद हूं। मैं जो करने की कोशिश कर रहा हूं उसके लिए कोई विचार?
शायद आप स्पष्ट कर सकते हैं कि "दो अलग-अलग प्रकार के तार" का क्या अर्थ है? –
मेरे सिर के ऊपर से, आपको बस उप-वर्गों पर निहित ऑपरेटरों और रचनाकारों को लागू करने की आवश्यकता हो सकती है। हाँ, कोड कॉपी करने की तरह, लेकिन कम से कम यह संतोषजनक प्रक्रिया को नियोजित नहीं कर रहा है या विरासत का उपयोग नहीं कर रहा है जब विरासत वास्तव में कुछ भी सचमुच संवाद नहीं करता है (अशिष्टता से, "KindOf" क्या है और क्या इसका वास्तव में कुछ मतलब है?) और बस ऐसे वर्गों में कोड डुप्लिकेशंस को कम करने के लिए जिनके समान समान वाक्यविन्यास (लेकिन विभिन्न उपयोग) के अलावा कुछ भी सामान्य नहीं है –
सहमत हैं, कक्षाएं वास्तव में एक ही विरासत पदानुक्रम में नहीं होनी चाहिए, विशेष रूप से आप उनको संदर्भित नहीं करना चाहते हैं एक सामान्य प्रकार से, आप उन्हें अलग रहना चाहते हैं। – Servy