2010-04-16 11 views
7

मैं निम्न कार्य करने की कोशिश कर रहा हूँ:पैरामीटर रहित कन्स्ट्रक्टर रखने के लिए मैं व्युत्पन्न कक्षाओं को क्यों लागू नहीं कर सकता?

class Program 
{ 
    static void Main(string[] args) 
    { 
     foo<baz> fooObject = new foo<baz>(); 
     AnotherClass<baz> _baz = new AnotherClass<baz>(); 
     _baz.testMethod(fooObject); 
    } 
} 

public class AnotherClass<T> where T : bar 
{ 
    public void testMethod(foo<T> dummy) 
    { 
     foobar = dummy; 
    } 

    private foo<T> foobar = null; 
} 

public class foo<T> where T : bar, new() 
{ 
    public foo() 
    { 
     _t = new T(); 
    } 

    private T _t; 

} 

public abstract class bar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 

public class baz : bar 
{ 
    public override void someMethod() 
    { 
     //Implementation 
    } 
}  

और मैं यह बताता है कि 'टी' के क्रम में पैरामीटर के रूप में इसका इस्तेमाल करने के 'टी' में एक सार्वजनिक parameterless निर्माता के साथ एक गैर सार प्रकार होना चाहिए कोई त्रुटि मिलती है सामान्य प्रकार या विधि। मैं पूरी तरह से समझता हूं कि यह क्यों होना चाहिए, और यह भी समझना चाहिए कि मैं 'नया' होने से बचने के लिए एक निर्माता के तर्क के रूप में 'टी' प्रकार की पूर्व-प्रारंभिक वस्तु को पार कर सकता हूं, लेकिन क्या इसके आसपास कोई रास्ता है? पैरामीटर रहित कन्स्ट्रक्टरों की आपूर्ति के लिए 'बार' से प्राप्त कक्षाओं को लागू करने का कोई तरीका?

फिक्स्ड - मुझे अन्य क्लास() पर 'नई()' बाधा याद आ रही थी।

उत्तर

5

क्या आप एक नया() अपने AnotherClass पर बाधा गायब नहीं?

public class AnotherClass<T> where T : bar, new() 

उस वीएस -2010 के बिना संकलन करने से इंकार कर दिया गया है, इसके साथ यह ठीक काम करता है।

+0

धन्यवाद, ऐसा लगता है कि यह तय हो गया है! –

0

क्या सामान्य वाक्य के बजाय सामान्य वाक्यविन्यास नया नहीं है?

इसके अलावा, आप एक वर्ग के बीच में के बजाय एक समारोह में इस कोड है, जो निश्चित है क्या कर रहे हैं यह भ्रमित करने के लिए:

_t = new T(); 

संपादित करें:

ठीक है, तो बाद सिंटैक्स क्लीनअप, मैं इस मुद्दे का अनुमान लगा रहा हूं कि 'बाज़' में पैरामीटर रहित कन्स्ट्रक्टर नहीं है। मुझे किसी भी तरह से पता नहीं है जिसमें आप इसे लागू कर सकते हैं।

एक समान प्रश्न here है, जो थोड़ा सा मदद कर सकता है।

+0

"कक्षा के मध्य में": यह प्रारंभिक मूल्य के साथ केवल एक फ़ील्ड घोषणा है। –

+0

फिक्स्ड, धन्यवाद। आधे छद्म कोड, मेरी आधा असली कोड की मेरी बुरी आदत! –

7

सही सिंटैक्स

public class foo<T> where T : bar, new() 
+0

क्षमा करें, मैंने इसे एक भीड़ में टाइप किया है। –

0

वैकल्पिक हल की तरह है - आप प्रतिनिधि एक प्रकार आप की जरूरत का उदाहरण बनाकर पारित कर सकते हैं:

Func<T> creator = ... 

    _t = creator(); 
1

आपका कोड VS2010 में संकलित करता है।

आप शायद बजाय इंटरफेस का उपयोग करना चाहते:

public class foo<T> where T : ibar, new() 
... 

public interface ibar 
{ 
    void someMethod(); 
} 

public abstract class bar : ibar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 
+0

यह मेरे लिए एक ही मुद्दा उत्पन्न करता है ... –

0

पहले उसे हटा "नई()" कीवर्ड से वर्ग "फू" की "कहाँ" के बाद के रूप में

public foo() 
{ 
    _t = Activator.CreateInstance<T>(); 
} 

निर्माता को बदलने चाहिए मुझे काम के लिए!

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

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