2011-03-14 18 views
15

में ऑब्जेक्ट बनाने में बाधा डाल सकते हैं क्या आप कृपया मेरी मदद कर सकते हैं। मेरे पास एक विचार है लेकिन मुझे नहीं पता कि मैं इसे कैसे कार्यान्वित कर सकता हूं।क्या हम निर्माता

तो सवाल यह है: हम निर्माता में एक वस्तु बनाने बाधित कर सकते हैं यानी

//Code 

SomeClass someClass = new SomeClass(someCriteria); 

तो अगर someCriteria हमारी आवश्यकताओं के उत्तर नहीं मिलता है हम एक वस्तु नहीं बनाना चाहिए और अशक्त लौटना चाहिए, बजाय नई वस्तु का।

क्या इसे सी # में लागू करना संभव है?

+0

आप अगर someCriteria निर्माता के लिए या तो एक मान्य प्रकार नहीं है निर्माता के अंदर यह कुछ तर्क विफल रहता है पूछ रहे हैं आप लिख चुके हैं? एक अमान्य प्रकार संकलित नहीं होगा और इसलिए कभी नहीं चलाया जा सकता है और इसलिए कभी बाधित नहीं किया जा सकता है, हालांकि मुझे लगता है कि आपको लगता है कि आपका मतलब अवरुद्ध है। – MattC

+0

मुझे अभी तक निर्भरता इंजेक्शन के बारे में पर्याप्त जानकारी नहीं है, लेकिन मुझे आश्चर्य है कि क्या निनजेक्ट जैसे ढांचे को कन्स्ट्रक्टर को कॉल को रोक दिया जा सकता है और आवश्यकता होने पर शून्य वापस आ सकता है? लेकिन मैं शायद तर्कों को साफ़ कर दूंगा और अपवाद फेंक दूंगा जैसे कि अन्य कोशिश करने से पहले सुझाव दे रहे हैं। – adam0101

उत्तर

17

सबसे अच्छा तरीका है एक कारखाने वर्ग है, लेकिन अगर आपके वर्ग इतना छोटा है तो आप इस का उपयोग कर सकते हैं:

class SomeClass 
    { 
     private string _someCriteria; 

     private SomeClass(string someCriteria) 
     { 
      _someCriteria = someCriteria; 
     } 

     public static SomeClass CreateInstance(string someCriteria) 
     { 
      if (someCriteria.Length > 2) 
      { 
       return new SomeClass(someCriteria); 
      } 
      return null; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 

      // returns null 
      SomeClass someClass = SomeClass.CreateInstance("t"); 

      // returns object 
      SomeClass someClass2 = SomeClass.CreateInstance("test"); 
     } 
    } 
+0

बहुत बहुत धन्यवाद। यह काम करता हैं! – Sergey

8

आप फ़ैक्टरी क्लास का उपयोग करना चाह सकते हैं जो कुछ क्लाइंटिया अमान्य होने पर कुछ क्लास लौटने के उदाहरण बनाता है।

+1

यह एक अच्छा जवाब है, खासकर जब @ जैन ज़्याका – corsiKa

5

यह सामान्य है कि यदि आप मान्य हैं तो आप कन्स्ट्रक्टर पैरामीटर की जांच करते हैं। यदि नहीं, तो आप आमतौर पर एक अपवाद फेंक देते हैं।

मैंने कन्स्ट्रक्टर पैरामीटर को सत्यापित करने के लिए स्थिर विधियां प्रदान करने के लिए एक अच्छी सलाह भी पढ़ी। यह आपकी कक्षा के उपयोगकर्ता को यह जांचने में सक्षम बनाता है कि जो कुछ भी वह कन्स्ट्रक्टर में पास करने जा रहा है वह सफल होगा या नहीं। जो लोग निश्चित हैं कि पैरामीटर ठीक हैं (उन्होंने कुछ प्रकार का सत्यापन किया है) सीधे निर्माता के साथ जाएंगे।

यह भी विचार करें कि आपकी कक्षा का उपयोगकर्ता संभवतः ऑब्जेक्ट के बजाय के साथ क्या करेगा (अगर किसी प्रकार की फैक्ट्री क्लास का उपयोग किया गया था)। क्या यह आमतौर पर अगली पंक्ति पर एक NullPointerException में परिणाम होगा? जितनी जल्दी हो सके गलत चीजों को रोकने के लिए आमतौर पर अच्छा विचार है, इस मामले में अपवाद फेंक दें और खत्म करें। यह शून्य की वापसी से क्लीनर समाधान है और यदि कोई वास्तव में चाहता है (यह निश्चित रूप से सबसे अच्छा अभ्यास नहीं होगा) वह अभी भी इस अपवाद को पकड़ सकता है ...

+2

के साथ संयुक्त यह एक अच्छा जवाब है, खासकर जब @bleeeah – corsiKa

2

यदि आपके कन्स्ट्रक्टर के पैरामीटर अमान्य हैं, तो ArgumentException या एक फेंकने पर विचार करें इसके वंशज वर्गों (जैसे ArgumentOutOfRangeException)।

+0

हाँ के साथ संयुक्त हो, तो बस अपना असाइनमेंट 'try..catch' के साथ लपेटें और' कैच 'असाइन करें शून्य। –

0

नहीं, यह सीधे संभव नहीं है।

आप अपवाद को फेंक सकते हैं और अपवाद की जांच करने के लिए आवश्यक कोड जोड़ सकते हैं और आपको चर के लिए शून्य निर्दिष्ट कर सकते हैं।

एक बेहतर समाधान एक कारखाने का उपयोग करना होगा जो कुछ स्थिति विफल होने पर शून्य वापस आ जाएगा।

var someClass = SomeClassFactory.Create(someCriteria); 
if(someClass != null) 
{ 
} 
0

new निर्माण गारंटी देता है कि एक वस्तु लौटा दी जाएगी (या एक अपवाद फेंका)। इसलिए ब्लीयाह की सिफारिश की गई, एक कारखाना या इसी तरह की अवधारणा आपको अपने तर्क को लागू करने की अनुमति देगी।

1

यह संभव होगा। ऑब्जेक्ट बनाने से पहले एक और तरीका आपकी जांच करना होगा।

SomeClass someClass = null; 

if (someCriteria == VALID) 
{ 
    someClass = new SomeClass(someCriteria); 
} 

आशा है कि इससे मदद मिलती है।