पर विचार करता है, तो हम लिख कर CRTP सम्मेलन से विचलित क्या होता है ...
public class Foo : TreeNode<Foo>
{
}
public class Bar : TreeNode<Foo> // parting from convention
{
}
... और इस प्रकार है तो उपरोक्त कोड फोन:
var foo = new Foo();
var foobar = new Bar();
foobar.AddChild(foo);
AddChild
कॉल एक InvalidCastException
फेंकता कह रहा है Unable to cast object of type 'Bar' to type 'Foo'.
सीआरटीपी मुहावरे के संबंध में - यह अकेले सम्मेलन है जिसे सामान्य प्रकार घोषित करने की आवश्यकता होती है आईएनजी प्रकार भाषा को उन अन्य मामलों का समर्थन करना चाहिए जहां सीआरटीपी सम्मेलन का पालन नहीं किया जाता है। एरिक लिपर्ट ने इस विषय पर एक महान ब्लॉग पोस्ट लिखा, कि वह इस अन्य crtp via c# answer से जुड़ा हुआ है।
ने कहा, अगर आप इस के लिए कार्यान्वयन को बदलने कि सब के सब ...
public class TreeNode<T> where T : TreeNode<T>
{
public void AddChild(T a_node)
{
a_node.SetParent(this);
}
void SetParent(TreeNode<T> a_parent)
{
m_parent = a_parent;
}
TreeNode<T> m_parent;
}
... ऊपर कोड है कि पहले InvalidCastException
फेंक दिया अब काम करता है।परिवर्तन m_Parent
TreeNode<T>
का एक प्रकार बनाता है; this
या तो Foo
वर्ग 'मामले में प्रकार T
या TreeNode<Foo>
से Bar
inherits के बाद से Bar
वर्ग मामले में TreeNode<T>
का एक उपवर्ग बनाने - किसी भी तरह से हमें SetParent
में डाली छोड़ और उस चूक द्वारा के बाद से अवैध डाली अपवाद से बचने के लिए अनुमति देता है सभी मामलों में असाइनमेंट कानूनी है। ऐसा करने की लागत अब सभी स्थानों पर T
का स्वतंत्र रूप से उपयोग करने में सक्षम नहीं है क्योंकि इसका पहले इस्तेमाल किया गया था जो सीआरटीपी के मूल्य को अधिक बलिदान देता है।
मेरा एक सहयोगी/दोस्त खुद को एक भाषा/भाषा-सुविधा के लिए नौसिखिया मानता है जब तक कि वह ईमानदारी से कह सके कि वह "इसे क्रोध में इस्तेमाल करता है" यानी, वह इस भाषा को बहुत निराश होने के लिए जानता है कि उसे जो कुछ चाहिए उसे पूरा करने का कोई तरीका नहीं है या ऐसा करने से दर्दनाक है। यह बहुत अच्छी तरह से उन मामलों में से एक हो सकता है, क्योंकि यहां सीमाएं और मतभेद हैं जो सत्य को प्रतिबिंबित करते हैं generics are not templates।
मैंने अपने उदाहरण को सरल बनाने की अनुमति दी। यदि आप सहमत नहीं हैं तो कृपया वापस आएं। – usr
ईमानदार होने के लिए, यह एक चालाक headf ** के जैसा दिखता है। इसके बजाए संरचना का उपयोग करके वृक्षों का प्रतिनिधित्व करने के अधिक पारंपरिक तरीकों में क्या गलत है? यह आपको क्या खरीदता है? मुझे उम्मीद है कि यह बहुत विरोधी नहीं लगता है। मैं सिर्फ उत्सुक हूँ। – spender
@ इसे आवंटन की संख्या का आधा हिस्सा दें, और उन अनुक्रमों की संख्या को कम कर देता है जिन्हें आपको अनुसरण करने की आवश्यकता है। तो उच्च प्रदर्शन कोड में यह एक उचित व्यापार बंद हो सकता है। छोटे पेड़ों के लिए यह शायद एक बुरा विचार है। – CodesInChaos