2009-09-05 12 views
11

मैं this code के लिए उपयोग नहीं कर सकता। इस पैटर्न का क्या उपयोग है?इस कोड का क्या उपयोग है?

public class Turtle<T> where T : Turtle<T> 
{ 
} 
+13

इसके कछुए नीचे सभी तरह से ... – Juliet

+0

Wha !? मुझे कुछ याद आना होगा ... –

+4

यदि आप मुझसे पूछें तो अधिक कछुए की जरूरत है। – Corey

उत्तर

9

यह पैटर्न अनिवार्य रूप से आपको मूल वर्ग के भीतर एक ठोस उप-वर्ग का संदर्भ देने की अनुमति देता है। उदाहरण के लिए:

public abstract class Turtle<T> where T : Turtle<T> 
{ 
    public abstract T Procreate(); 
} 

public class SeaTurtle : Turtle<SeaTurtle> 
{ 
    public override SeaTurtle Procreate() 
    { 
     // ... 
    } 
} 

बनाम:

public abstract class Turtle 
{ 
    public abstract Turtle Procreate(); 
} 

public class SnappingTurtle : Turtle 
{ 
    public override Turtle Procreate() 
    { 
     // ... 
    } 
} 

पूर्व में, यह निर्दिष्ट है कि एक SeaTurtle के बच्चे को एक SeaTurtle हो जाएगा।

+0

क्या आपको लगता है कि अगर इस तरह की चीज की आवश्यकता नहीं है, तो अनुबंध भिन्नता के लिए समर्थन है? – shahkalpesh

+1

इसे और अधिक उपयोग मिल गया है। यह सबक्लास के लिए इंटरफेस लागू कर सकता है। जैसे, जावा में, 'java.lang.Enum' subclass के लिए' java.lang.comparable 'को लागू करने के लिए पैटर्न का उपयोग करता है। मुझे यकीन है कि सी # में कुछ समान है। –

+0

निश्चित रूप से अन्य उपयोग हैं, लेकिन उनमें सभी माता-पिता को अपने उप-वर्ग के प्रकार का उपयोग करने की आवश्यकता है। इंटरफेस के कार्यान्वयन के संबंध में, आपके पास दो विकल्प हैं: टी या कछुए के लिए इंटरफ़ेस लागू करें। IComparable केवल आपको उसी उप-वर्ग की वस्तुओं की तुलना करने देगा, जहां IComparable > आपको किसी भी कछुए की तुलना करने देगा। और चूंकि .NET 4.0 के IComparable टी में contravariant होगा, तो आप एक IComparable > एक IComparable के रूप में उपयोग करने में सक्षम होंगे क्योंकि टी: कछुए । – dahlbyk

-1

[कोड यहाँ भावी पीढ़ी के लिए बार-बार] किसी काम का नहीं है कि मैं देख सकता है। असल में, यह

public class Turtle 
{ 
} 
+1

यह वही नहीं है क्योंकि दिए गए कोड में, 'कछुए' को तत्काल नहीं किया जा सकता है। – strager

+1

हां यह कर सकता है ... मार्क ग्रेवेल की टिप्पणी यहां देखें http://stackoverflow.com/questions/194484/whats-the-strangest-corner-case-youve-seen-in-c-or-net/1332344#1332344 –

+0

@ लेवेस्क, और आरसीईक्स की टिप्पणी के बाद देखें। – strager

संबंधित मुद्दे