कुछ भी जो I3 को लागू करता है, I1 और I2 को लागू करने की आवश्यकता होगी, और I3 को प्राप्त करने वाले विभिन्न वर्गों से वस्तुओं को तब परस्पर विनिमय (नीचे देखें) का उपयोग किया जा सकता है, इसलिए क्या I3 को खाली कहना सही है? यदि ऐसा है तो यह वास्तुकला का एक बेहतर तरीका क्या होगा?
"बंडलिंग" I1और I2में I3प्रदान करता है एक अच्छा (?) शॉर्टकट, या जहाँ भी आप चाहते हैं दोनों लागू किया जाना वाक्य विन्यास को चीनी के कुछ प्रकार।
इस दृष्टिकोण के साथ समस्या यह है कि आप अन्य डेवलपर्स को स्पष्ट रूप से लागू करने I1 और I2 अगल - बगल से रोक नहीं सकते हैं , लेकिन यह दोनों तरीकों से काम नहीं करता है - जबकि : I3इसके बराबर है : I1, I2, के : I1, I2बराबर नहीं है : I3। भले ही वे कार्यात्मक रूप से समान हों, एक वर्ग जो दोनों का समर्थन करता है I1और I2समर्थन के रूप में नहीं पाया जाएगा I3।
इसका मतलब है कि आप एक ही चीज़ को पूरा करने के दो तरीके पेश कर रहे हैं - "मैनुअल" और "स्वीट" (अपने सिंटेक्स शुगर के साथ)। और यह कोड संगतता पर बुरा प्रभाव डाल सकता है। एक ही चीज़ को पूरा करने के लिए 2 अलग-अलग तरीके यहाँ, वहाँ, और दूसरी जगह 8 संभावित संयोजनों के परिणाम पहले से ही दे रहे हैं :)
void foo() {
I1 something = new A();
something = new B();
something.SomeI1Function();
something.SomeI2Function(); // we can't do this without casting first
}
ठीक है, तुम नहीं कर सकते। लेकिन शायद यह वास्तव में एक अच्छा संकेत है?
यदि I1और I2अलग-अलग ज़िम्मेदारियाँ हैं (अन्यथा उन्हें पहली बार में अलग करने की कोई आवश्यकता नहीं होगी), तो शायद एक ही बार में दो अलग-अलग ज़िम्मेदारियों को निभाने की foo()कोशिश करना गलत है something?
दूसरे शब्दों में, यह हो सकता है कि foo()स्वयं सिंगल रिस्पॉन्सिबिलिटी के सिद्धांत का उल्लंघन करता है, और यह तथ्य कि इसे खींचने के लिए कास्टिंग और रनटाइम प्रकार की जांच की आवश्यकता होती है, एक लाल झंडा है जो हमें इसके बारे में चिंतित करता है।
संपादित करें:
यदि आप यह सुनिश्चित करने पर जोर देते हैं कि fooकुछ ऐसा है जो लागू करता है I1और I2, आप उन्हें अलग मापदंडों के रूप में पारित कर सकते हैं:
void foo(I1 i1, I2 i2)
और वे एक ही वस्तु हो सकते हैं:
foo(something, something);
fooयदि वे एक ही उदाहरण हैं या नहीं तो क्या परवाह है?
लेकिन अगर यह परवाह करता है (जैसे कि क्योंकि वे स्टेटलेस नहीं हैं), या आपको लगता है कि यह बदसूरत लग रहा है, तो कोई इसके बजाय जेनरिक का उपयोग कर सकता है:
void Foo<T>(T something) where T: I1, I2
अब सामान्य बाधाएं बाहरी दुनिया को किसी भी चीज़ के साथ प्रदूषित नहीं करते हुए वांछित प्रभाव का ख्याल रखती हैं। यह मुहावरेदार सी # है, संकलन-समय की जाँच के आधार पर, और यह समग्र रूप से अधिक सही लगता है।
मैं I3 : I2, I1कुछ प्रकार की भाषा में यूनियन प्रकारों का अनुकरण करने के प्रयास के रूप में देखता हूं जो इसे बॉक्स से बाहर का समर्थन नहीं करता है (C # या Java नहीं, जबकि कार्यात्मक भाषाओं में यूनियन प्रकार मौजूद हैं)।
एक ऐसे निर्माण का अनुकरण करने की कोशिश करना जो वास्तव में भाषा द्वारा समर्थित नहीं है, अक्सर अकड़ता है। इसी तरह, सी # में आप अगर आप का अनुकरण करना चाहते हैं विस्तार के तरीकों और इंटरफेस का उपयोग कर सकते mixins । मुमकिन? हाँ। अच्छा विचार? मुझे यकीन नहीं है।