2012-10-09 27 views
6

के बिना पैरामीटर रहित कन्स्ट्रक्टर को लागू करने का कोई तरीका है मेरे पास एक इंटरफ़ेस ISnack है जो क्लास द्वारा कार्यान्वित किया गया है, इसमें डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए। मूल रूप से इस:जेनेरिक बाधा

public interface ISnack<T> where T : new() 
{ 

} 

मैं <T> where T : new() का उपयोग सिर्फ parameterless निर्माता लागू करने के लिए।

मैं तो इंटरफ़ेस इस तरह से लागू करना होगा:

public class Cutlet : ISnack<Cutlet> 
{ 

} 

यह काम करता है और यह बस सुनिश्चित करता है Cutlet वर्ग एक parameterless निर्माता है।

public abstract class Kitchen<T> where T : ISnack 
{ 

} 

आवश्यकता है कि Kitchen बाधा जहां T एक ISnack होना चाहिए होना चाहिए:

अब मैं एक सार आधार वर्ग Kitchen है। लेकिन यह काम नहीं करेगा क्योंकि ISnack कोई मौजूद नहीं है, लेकिन केवल ISnack<T> है।

यदि मैं यह

public abstract class Kitchen<T> where T : ISnack<T> 
{ 

} 

की कोशिश की यह संकलन नहीं ('T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'ISnack<T>') है और यह भी मेरे संदर्भ में कोई मतलब नहीं होगा।

अगर मैं एक T प्रकार पैरामीटर द्वारा बाधित किए बिना एक parameterless निर्माता के लिए ISnack रों मजबूर सकता है, तो TKitchen<T> में आसानी से एक ISnack हो सकता है। इसके बारे में कैसे जानें?

उत्तर

10

आप तब तक नहीं कर सकते जब तक आप बाधा नहीं डालते; सामान्य की कमी तो संकलक खुश आपके पास करने के लिए होगा बनाने के लिए संचयी होते हैं,:

public abstract class Kitchen<T> where T : ISnack<T>, new() 

अगर वह ठीक है, तो है कि। यदि यह ठीक नहीं है, तो आपको मूल से : new को हटाना होगा, और इसके बिना करना होगा। यह उतना बुरा नहीं है जितना लगता है, लेकिन इसका मतलब है कि आप संकलन के बजाय निष्पादन के लिए सत्यापन को दबाते हैं। लेकिन: Activator.CreateInstance<T>() अभी भी वही करता है जो आपको चाहिए, वैसे भी - new() बाधा के बिना भी। तो अगर आप की जगह ले सकता:

साथ
T newObj = new T(); // validated by the compiler 

:

T newObj = Activator.CreateInstance<T>(); // not validated until executed 

एक आसान चाल जब दूर करने की कमी हो सकता है: कि प्रतिबिंब के माध्यम से उम्मीदवार प्रकार पाता है एक इकाई/एकीकरण परीक्षण जोड़ सकते हैं और लापता बाधा को मान्य आपके परीक्षण सूट के हिस्से के रूप में।

+0

मार्क, डिट्टो! आपने जो कुछ भी किया है, उसे रेखांकित किया है .. हमम रनटाइम वह विकल्प है जो मुझे लगता है कि मुझे लगता है कि – nawfal

+1

@nawfal अगर यह ठीक है, तो आप रसोई के लिए एक दूसरा सामान्य तर्क जोड़ सकते हैं और यह काम करना चाहिए: 'कक्षा रसोई जहां टी: ISnack जहां एस: नया() ' –

+0

@ फ़ेलिक्सके। क्या आप इसे एक और जवाब दे सकते हैं? – nawfal

1

बस बाधा टी करने के लिए फिर से

public abstract class Kitchen<T> where T : ISnack<T>, new() {  } 
3

आप एक दूसरी सामान्य पैरामीटर का उपयोग कर सकते हैं जोड़ें:

abstact class Kitchen<T, S> 
    where T : ISnack<S> 
    where S : new() 
.... 

यह आपकी समस्या का समाधान होगा।

कक्षा में दूसरा पैरामीटर जोड़ने से कुछ समस्याएं हो सकती हैं जिन्हें मैंने सामना किया है क्योंकि .NET 2.0 उपलब्ध है। कुछ जटिल परिस्थितियों में आपको कक्षाओं के लिए अधिक सामान्य पैरामीटर जोड़ने की आवश्यकता हो सकती है। आम तौर पर मैं अधिक प्रत्यक्ष कास्ट जोड़कर जेनेरिक चेन को तोड़ता हूं (जैसे (SpecificType)base.MyTypeTProperty)। टिप्पणी: मैं बाद में नमूना खोजने की कोशिश करता हूं

+0

यह भी काम करता है, लेकिन मुझे लगता है कि एक मार्क की तुलना में कम सुरुचिपूर्ण है – nawfal

+0

@nawfal बेशक, और इससे अधिक जटिल स्थितियों में समस्याएं पैदा हो सकती हैं। मैं शायद बाद में एक उदाहरण पोस्ट करने वाला हूँ। –

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