2010-07-13 10 views

उत्तर

16

आप हाँ सामान्य की कमी के बारे में बात करते हैं कर रहे हैं,:

class SomeContainer<T> where T : new() { 
    ... 
} 

आप विरासत के बारे में बात कर रहे हैं। यह आवश्यक नहीं है कि प्रत्येक कक्षा जो आपके इंटरफ़ेस को लागू करती है या आपके बेस क्लास को विरासत में रखती है, में पैरामीटर रहित कन्स्ट्रक्टर होता है। ;

abstract class MyBase { 
    protected MyBase() { 
     if (GetType().GetConstructor(Type.EmptyTypes) == null) 
      throw new InvalidProgramException(); 
    } 
} 

आप एक ही वर्ग के बारे में बात कर रहे हैं, हाँ:

सबसे अच्छा तुम कर सकते हो

अपने आधार निर्माता (कार्यावधि में) एक अपवाद फेंक में उपयोग के प्रतिबिंब, इस तरह है बस एक में डाल दें।

1

यह आपके लिए क्या मतलब है निर्भर करता है।

उदाहरण के लिए, आप कक्षा में एक सामान्य प्रकार पैरामीटर या new कीवर्ड के साथ पैरामीटर-कम कन्स्ट्रक्टर रखने की विधि को बाधित कर सकते हैं, लेकिन इससे परे वास्तविक वर्ग परिभाषा को सीमित करने की वास्तविक विधि नहीं है।

public void DoSomething<T>() where T : new() { } 
1

सरकारी MSDN दस्तावेज में उल्लेख किया है, सी # संकलक स्वचालित रूप से एक parameterless निर्माता कि डिफ़ॉल्ट मानों के लिए सभी सदस्य चर initializes उत्पन्न करता है। आप अपने खुद के कार्यान्वयन को लागू करना चाहते हैं, तो आप बस यह कर सकते हैं:

वर्ग BaseClass { BaseClass() {// parameterless निर्माता का कार्यान्वयन} }

आप सामान्य की कमी की बात कर रहे हैं, फिर स्लाक्स की पोस्ट देखें।

संदर्भ

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

+2

इसके अतिरिक्त, आप एक क्लास को निजी एक्सेस संशोधक का उपयोग करके पैरामीटर रहित कन्स्ट्रक्टर नहीं कर सकते हैं। –

+1

उप-वर्गों में अभी भी एक पैरामीटर रहित कन्स्ट्रक्टर हो सकता है, भले ही बेस क्लास कन्स्ट्रक्टर निजी हो, तब तक कम से कम एक बेस कन्स्ट्रक्टर सार्वजनिक या संरक्षित है (या आंतरिक वर्ग यदि उप वर्ग एक ही असेंबली में है)। –

+0

@ पोस्टमैन: यह उप-वर्ग को बेस कन्स्ट्रक्टर को हमेशा कुछ पैरामीटर प्रदान करने के लिए प्रतिबंधित करेगा, लेकिन यह "काम नहीं करेगा" से बहुत रोना है। –

0

मैं इस तरह एक समस्या कई बार सामना किया है, मुझे लगता है कि सार/इंटरफ़ेस निर्माताओं के लिए यह आवश्यक हैं। समस्या तब होती है जब आप Activator.CreateInstance या किसी अन्य तकनीक को तत्काल करने के लिए उपयोग कर रहे हैं जिसे आप कार्यान्वित नहीं कर सकते (सुंदर सामान्य आईओसी)। यदि आप डेवलपर को सही पैरा के साथ एक कन्स्ट्रक्टर को कार्यान्वित करने के लिए मजबूर कर सकते हैं तो जीवन बहुत आसान होगा - भले ही उद्देश्य बेस कन्स्ट्रक्टर को पैरा को पास करना है।

new() बाधा ने 2.0 के बाद से समस्या को थोड़ा सा मदद की है, लेकिन यह अभी भी जेनेरिक का उपयोग न करने का उपयोग करते समय समस्या का समाधान नहीं करता है, या यदि आप विशिष्ट तर्क चाहते हैं (और अजीब के साथ गड़बड़ नहीं करना चाहते हैं ConstructorInfo, जिसे स्थैतिक रूप से चेक नहीं किया जा सकता है।)

2

जेनेरिक्स इस लागू कर सकते हैं, लेकिन हम हमेशा जेनरिक उपयोग नहीं कर रहे, पी

आप इकाई परीक्षण का उपयोग कर रहे हैं, तो आप प्रतिबिंब का उपयोग सभी प्रकार है कि पैटर्न को पूरा करते हैं सकता है आपके पास करने के लिएचाहते पैरामीटर रहित कन्स्ट्रक्टर (उदाहरण के लिए, MyBaseObject से प्राप्त सब कुछ, या Foo.Bar नेमस्पेस में सब कुछ), और पैरामीटर रहित कन्स्ट्रक्टर ढूंढकर)।

यदि आप इसे रनटाइम पर भी जोर देना चाहते हैं (शायद #DEBUG में), स्थिर रचनाकार जैसी चीजें अतिरिक्त प्रकार के चेक इंजेक्ट करने के लिए उपयोगी बिंदु हो सकती हैं।

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