2011-09-20 29 views
5

विरासत में मिला है दुर्भाग्य से, मुझे मूल परियोजना नहीं मिल रही है जिसने मुझे इस प्रश्न का नेतृत्व किया। शायद इस सवाल को थोड़ा और संदर्भ दिया होगा।सारणी वर्ग सबसे व्युत्पन्न प्रकार

संपादित करें: पर एक ठोस कार्यान्वयन के साथ http://mews.codeplex.com/SourceControl/changeset/view/63120#1054567: मैं मूल परियोजना मैं में इस देखा है पाया http://mews.codeplex.com/SourceControl/changeset/view/63120#1054606

कहना मैं एक ठोस कार्यान्वयन करता है कुछ की तरह उपयोगी के साथ एक अमूर्त वर्ग है की सुविधा देता है:

abstract class AbstractClass 
{ 
    public virtual int ConvertNumber(string number) 
    { 
     string preparedNumber = Prepare(number); 
     int result = StringToInt32(number); 
     return result; 
    } 

    protected abstract string Prepare(string number); 

    protected virtual int StringToInt32(string number) 
    { 
     return Convert.ToInt32(number); 
    } 
} 

sealed class ConcreteClass : AbstractClass 
{ 
    protected override string Prepare(string number) 
    { 
     return number.Trim(); 
    } 

    public override int ConvertNumber(string number) 
    { 
     return base.ConvertNumber(number); 
    } 
} 

यह उतना ही बुनियादी है जितना इसे प्राप्त होता है।

abstract class AbstractGenericClass<TGenericClass> 
    where TGenericClass : AbstractGenericClass<TGenericClass> 
{ 
    public virtual int ConvertNumber(string number) 
    { 
     string preparedNumber = Prepare(number); 
     int result = StringToInt32(number); 
     return result; 
    } 

    protected abstract string Prepare(string number); 

    protected int StringToInt32(string number) 
    { 
     return Convert.ToInt32(number); 
    } 
} 

sealed class ConcreteGenericClass : AbstractGenericClass<ConcreteGenericClass> 
{ 
    protected override string Prepare(string number) 
    { 
     return number.Trim(); 
    } 

    public override int ConvertNumber(string number) 
    { 
     return base.ConvertNumber(number); 
    } 
} 

अब क्यों एक ऐसी बात करना होगा: अब कोड में मैं वेब लेखक सबसे व्युत्पन्न प्रकार से सार वर्ग इनहेरिट द्वारा inheritence लागू किया, उदा पर देखा है? मुझे बहुत अस्पष्टता से याद है कि यह एक कारण था जो एटीएल में प्रदर्शन कारणों से उपयोग किया जाता था (एक vtable के साथ काम किए बिना ठोस सदस्य कार्यान्वयन को बुलाए जाने का कोई तरीका?) मुझे इस हिस्से पर बहुत यकीन नहीं है।

मैंने दोनों मामलों के लिए जेनरेट आईएल की जांच की है और वे बिल्कुल वही हैं।

यह मुझे कौन समझा सकता है?

+0

मैं कोड के अपने पहले अनुभाग संकलित नहीं लगता। 'सार्वजनिक ओवरराइड int ConvertNumber (स्ट्रिंग नंबर) 'लेकिन मूल प्रकार में ओवरराइड करने के लिए ऐसी कोई विधि नहीं है। –

+0

मुझे लगता है कि ऐसा नहीं किया जा रहा है? http://pastebin.com/BgpuKYb7 – Zenwalker

+1

@DannyChen: आपका अधिकार, मैंने मार्कअप के लिए कोड थोड़ा सा बदल दिया है, मैंने इसे अभी ठीक कर दिया है। प्रश्न अभी भी – Polity

उत्तर

4

यह एक सी # संस्करण है जिसे सी ++ में उत्सुकता से आवर्ती टेम्पलेट पैटर्न कहा जाता है। यह थोड़ा अजीब है, और व्यक्तिगत रूप से, मैं इसे टालने की कोशिश करता हूं। यह उपयोगी है, लेकिन मुझे उपयोगी से अधिक भ्रमित लगता है।

जानकारी के लिए मेरा लेख देखें:

http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx

+0

धन्यवाद एरिक! यह वास्तव में मेरे दिमाग से गड़बड़ कर रहा था। सौभाग्य से आपके लेख ने इसे ज़ोरदार और स्पष्ट समझाया। – Polity

+1

@ एरिक लिपर्ट - मुझे इस पैटर्न को पसंद है ताकि पूर्वजों के वर्ग के सदस्य हो सकें जो वंश वर्गों के उदाहरणों का उपयोग/वापसी कर सकें। मुझे ओपी के उदाहरण कोड की ऐसी विधि या संपत्ति होने की उम्मीद थी। फिर भी, केवल नकारात्मक पक्ष यह है कि यदि आप पैटर्न को तोड़ सकते हैं, उदाहरण के लिए, 'क्लास एक्स: सारस्ट्रोजेनिक क्लास ' और आपके पास 'क्लास वाई: सारस्ट्रोजेनिक क्लास 'है। मैं सी # को इस "बाधा" को रोकने के लिए प्यार करूंगा - यानी 'अमूर्त वर्ग ए जहां टी: यह, ए '- जैसे ही आप एक ठोस वर्ग घोषित करते हैं तो सामान्य पैरामीटर स्वयं होना चाहिए। ** नज नज ** एरिक। – Enigmativity

+0

@ निष्क्रियता: दरअसल, मैं जिस लेख से जुड़ी हुई लेख में आपकी पहचान की कमी करता हूं, उस पर चर्चा करता हूं। पैटर्न को काम करने के लिए आपको वास्तव में "थिस्ट टाइप" निर्माण की आवश्यकता है। आप हास्केल में उस तरह की चीज कर सकते हैं लेकिन सी # में नहीं; ऐसा करने के लिए सीएलआर प्रकार प्रणाली के लिए कुछ सुंदर काम की आवश्यकता होगी, इसलिए जल्द ही ऐसा होने की संभावना नहीं है। –

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