2010-06-06 18 views
5

मेरे पास दो वर्ग, एक बेस क्लास और एक बाल वर्ग है। आधार वर्ग में मैं एक सामान्य आभासी विधि को परिभाषित:अजीब जेनरिक संकलन त्रुटि

protected virtual ReturnType Create<T>() where T : ReturnType {}
तो मेरे बच्चे को कक्षा में

मैं यह करने के लिए प्रयास करें:

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Create()'. There is no boxing conversion or type parameter conversion from 'T' to 'ReturnType'.

:

protected override ReturnTypeChild Create<T>() // ReturnTypeChild inherits ReturnType 
{ 
    return base.Create<T> as ReturnTypeChild; 
}

दृश्य स्टूडियो इस अजीब त्रुटि देता है बच्चे के ओवरराइड पर जहां क्लॉज दोहराता है उसे दोहराता है:

Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly

तो मैं यहाँ क्या गलत कर रहा हूँ?

+0

क्या इसे 'चाइल्ड चिड़ियाघर () 'ओवरराइड किया जाना चाहिए? क्या आप उचित नाम दे सकते हैं? फू और बार मेरे सिर को चोट पहुंचाते हैं। – Kobi

+0

और इसे वापस आधार नहीं होना चाहिए। Foo BarChild() ;? – GenericTypeTea

+1

आपके कोड में सभी प्रकार की समस्याएं हैं (उदा। आपकी ओवरराइड विधि में इसका सामान्य पैरामीटर गुम है, आपके रिटर्न स्टेटमेंट में गलत स्थान पर माता-पिता हैं)। यदि आप अपनी समस्या का न्यूनतम प्रजनन करते हैं तो सभी उपयोगी मुद्दों को ठीक करने के लिए आपको उपयोगी उत्तर मिलेंगे। – kvb

उत्तर

3

यह काम करता है।

public class BaseClass { 
    public virtual T Create<T>() where T : BaseClass, new() { 
    var newClass = new T(); 
    //initialize newClass by setting properties etc 
    return newClass; 
    } 
} 

public class DerivedClass : BaseClass { 
    public override T Create<T>() { 
    var newClass = base.Create<T>(); 
    //initialize newClass with DerivedClass specific stuff 
    return newClass; 
    } 
} 

void Test() { 

DerivedClass d = new DerivedClass() ; 
d.Create<DerivedClass>(); 
} 

ये कुछ बुनियादी C# override rules हैं::

The overridden base method must have the same signature as the override method.

यह वही वापसी प्रकार और एक ही विधि का तर्क मतलब है कि आप वापसी प्रकार सामान्य बनाने के लिए किया था।

+0

क्या आप 1 और बार संपादित कर सकते हैं? कक्षाओं को उचित रूप से प्रारूपित करने के लिए इंडेंटिंग की आवश्यकता है AFAICT –

+0

ओह, ठीक है। –

2

आपका ओवरराइड रिटर्न प्रकार नहीं बदल सकता है, भले ही रिटर्न टाइप बेस क्लास विधि के रिटर्न प्रकार से प्राप्त हो। आपको कुछ ऐसा करना है जो इगोर ने ऊपर किया था, और वापसी प्रकार जेनेरिक बना दिया है।

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