2013-06-14 4 views
5

यह कन्स्ट्रक्टर में निर्णय लेने के लिए सी # में सटीक है, जो अन्य कन्स्ट्रक्टर का उपयोग ओवरराइड करता है? यह नीचे कोड संकलित नहीं करता है! मुझे नहीं पता कि कौन सा आवेषण उपयोग है।क्या एक निर्माता में तर्क शामिल हो सकता है जो निर्धारित करता है कि कौन सा अन्य कन्स्ट्रक्टर कॉल करने के लिए ओवरराइड करता है?

public IntRange(int val, bool isMax) 
     : isMax ? this() : this() 
    { 
     if (isMax) 
     { 
      IntRange(0, val); 
     } 
     else 
     { 
      IntRange(val, int.MaxValue); 
     } 
    } 
+4

नहीं, केवल सामान्य तर्कों में सामान्य तर्क निकालें और उन्हें 'isMax' के मान के आधार पर निर्माता के भीतर बुलाएं। – vcsjones

+3

ऐसा लगता है कि _any_ कन्स्ट्रक्टर को कॉल करने से पहले यह निर्णय बेहतर होगा। – DonBoitnott

+3

सी # में नहीं। मुझे लगता है कि यह कानूनी रूप से आईएल में किया जा सकता है। –

उत्तर

9

कैसे के बारे में:

class IntRange { 
     public IntRange(int val, bool isMax) 
     : this(isMax ? 0 : val, isMax ? val : int.MaxValue) { 
     } 
     public IntRange(int min, int max) { 
     } 
    } 
+0

मैं शायद मैक्स को एक डिफ़ॉल्ट परम भी बना दूंगा (झूठा), अगर यह बहुत उपयोग नहीं किया जा रहा है, या बस इसे कॉल करना आसान बनाता है। –

2

आप के रूप

class IntRange { 

    public IntRange(int min, int max) { 
     // write code here 
    } 

    public static IntRange Construct(int val, bool isMax) { 
     if (isMax) { 
      return new IntRange(0, val); 
     } else { 
      return new IntRange(val, int.MaxValue); 
     } 
    } 
} 

इस प्रकार वस्तु पर एक स्थिर पद्धति का उपयोग करके बात उस तरह प्राप्त कर सकते थे तुम भी निर्माता public IntRange(int min, int max) निजी, स्थैतिक विधि के उपयोग को मजबूर करने के लिए कर सकता है।

मुझे लगता है कि ऐसी वस्तुओं को बनाने के लिए स्थिर तरीके विशेष रूप से उपयोगी होती हैं जब कोई इसके बजाय उप-वर्ग बनाना चाहता है।

+0

फैक्ट्री विधि दृष्टिकोण। अच्छा लगा। जैसा कि आप नोट करते हैं, मैं आम तौर पर उस परिदृश्य में गैर स्थैतिक कन्स्ट्रक्टर को निजी बना देता हूं। –

0

यह बयान isMax की वजह से संकलन नहीं करता है? यह(): यह() बाद में एक निर्माता में: आप केवल उसी वर्ग के बेस क्लास कन्स्ट्रक्टर या ओवरलोडेड कन्स्ट्रक्टर को कॉल कर सकते हैं।

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

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