कुछ भी जो 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 । मुमकिन? हाँ। अच्छा विचार? मुझे यकीन नहीं है।