हर बार मैं एक आत्म-संदर्भ ("रिफ्लेक्सिव") टाइप पैरामीटर बाधा जोड़कर एक सरल इंटरफ़ेस को और अधिक जटिल बना रहा हूं। उदाहरण के लिए, मैं इस बदल सकता:रिफ्लेक्सिव प्रकार पैरामीटर बाधाएं: एक्स <T> जहां टी: एक्स <T> - कोई आसान विकल्प?
मेंinterface ICloneable
{
ICloneable Clone();
}
class Sheep : ICloneable
{
ICloneable Clone() { … }
} //^^^^^^^^^^
Sheep dolly = new Sheep().Clone() as Sheep;
//^^^^^^^^
:
interface ICloneable<TImpl> where TImpl : ICloneable<TImpl>
{
TImpl Clone();
}
class Sheep : ICloneable<Sheep>
{
Sheep Clone() { … }
} //^^^^^
Sheep dolly = new Sheep().Clone();
मुख्य लाभ: एक को लागू करने (जैसे Sheep
के रूप में) अब इसके आधार प्रकार के बजाय खुद को दर्शा सकते हैं की आवश्यकता को कम टाइप-कास्टिंग (जैसा कोड की अंतिम पंक्ति द्वारा प्रदर्शित किया गया है)।
हालांकि यह बहुत अच्छा है, मैंने यह भी देखा है कि इन प्रकार की पैरामीटर बाधाएं अंतर्ज्ञानी नहीं हैं और अधिक जटिल परिदृश्यों में समझने में प्रवृत्ति वास्तव में मुश्किल हो गई है। *)
प्रश्न: किसी को भी एक और सी # कोड पैटर्न है कि एक ही प्रभाव को प्राप्त होता है या कुछ इसी तरह का पता है, लेकिन एक आसान करने के लिए समझ फैशन में?
*) इस कोड पैटर्न unintuitive और जैसे को समझने के लिए मुश्किल हो सकता है इन तरीकों से: "। तो
T
एकX<T>
है, तोX<T>
वास्तव में एकX<X<…<T>…>>
कि"
घोषणा
X<T> where T : X<T>
पुनरावर्ती प्रतीत होता है, और एक आश्चर्य हो सकता है क्यों संकलक doesn't get stuck in an infinite loop, तर्क, (लेकिन कमी स्पष्ट रूप से इस तरह हल नहीं है।)इसको लागू करने के लिए, यह स्पष्ट नहीं हो सकता है कि किस प्रकार
TImpl
के स्थान पर निर्दिष्ट किया जाना चाहिए। एक बार जब आप अधिक प्रकार पैरामीटर जोड़ सकते हैं और मिश्रण करने के लिए विभिन्न सामान्य इंटरफेस के बीच संबंधों subtyping, चीजें काफी जल्दी अनियंत्रित मिल (बाधा अंततः उस का ख्याल रखना होगा।)।
आपको यह जानकर खुशी होगी कि यह नाम रखने के लिए काफी आम है: इसे 'उत्सुकता से आवर्ती टेम्पलेट पैटर्न' (संक्षिप्त के लिए सीआरटीपी) कहा जाता है। – Cameron
... और इसमें बाधाओं से कोई लेना देना नहीं है (मानक सी ++ टेम्पलेट्स में उन्हें बिल्कुल नहीं है)। – Krizz
क्या कोई कारण नहीं है कि यह 'इंटरफ़ेस आईसीएलनेबल {टी क्लोन() नहीं है; } '? –