2013-06-23 6 views
5

के लिए गणना मूल्यों को गुजरने वाले कंस्ट्रक्टर चेनिंग मैं एक इंस्टेंटेटर से दूसरे में कैसे जा सकता हूं? मान लीजिए कि हमारे पास यह कक्षा थी। मैं foo (स्ट्रिंग, स्ट्रिंग) से foo (उरी) तक कैसे पास करूं?नियंत्रक चेनिंग पैरामीटर

public foo 
{ 
    string path { get; private set; } 
    string query { get; private set; } 

    public foo (Uri someUrl) 
    { 
     // ... do stuff here 
    } 

    public foo (string path, string query) 
    { 
     Uri someUrl = new Uri(String.Concat(path, query); 

     // ... do stuff here to pass thru to foo(someUrl) 
    } 
} 
+0

फिर से खोलने के लिए वोटिंग। डुप्लिकेट पोस्ट में उत्तर सही है लेकिन बाद के कन्स्ट्रक्टर को पास करने के लिए "सरल" पैरामीटर के लिए अधिक उन्मुख है। ओपी के पद से पता चलता है कि यूआरआई को पास करने से पहले कुछ प्रसंस्करण किया जाना है। एक अधिक उपयुक्त उत्तर एक सामान्य विधि होगी कि दोनों रचनाकार संदर्भ के अनुसार पैरामीटर को कॉल और पास करें। – keyboardP

+0

@keyboardP, आपसे सहमत हैं। मैंने शीर्षक को संशोधित करने के लिए संशोधित किया और अधिक सटीक, और फिर से खोलने के लिए मतदान किया। (इस बारीकियों के डुप्लिकेट की भी तलाश की, और खाली हो गया) –

+0

फिर से खोलने के लिए धन्यवाद। –

उत्तर

4

तुम भी कुछ ऐसा कर सकते हैं: विकल्प एक प्रारंभ विधि में अपने कोड refactor करने के लिए है सामान्य विधि उदाहरण

private void ProcessUri(ref Uri theUri) 
{ 
    //...do your URI stuff here 
} 

public foo (Uri someUrl) 
{ 
    ProcessUri(ref someUrl); 
} 

public foo (string path, string query) 
{ 
    Uri someUrl = new Uri(String.Concat(path, query)); 

    // ... do stuff here to pass then call ProcessUri 
    ProcessUri(ref someUrl); 
} 

लिए ref साथ गुजर बातों का लाभ आप बस की तरह आप अगर चर निर्माता के भीतर स्थापित किया गया था होगा readonly संपत्तियों की मूल्यों को निर्धारित कर सकते हैं।

+0

बहुत बढ़िया। यह वह तकनीक है जिसका उपयोग मैंने समाप्त किया। धन्यवाद! –

7

सरल निर्माता श्रृंखलन के लिए, आप विशेष कीवर्ड this या base वर्तमान या अभिभावक वर्ग के अन्य निर्माताओं का उल्लेख करने के लिए उपयोग कर सकते हैं। आपको निष्पादक कन्स्ट्रक्टर के लिए किसी भी पैरामीटर का उपयोग करने के लिए जंजीर कन्स्ट्रक्टर के पैरामीटर के रूप में उपयोग करने की अनुमति है, और आप उन्हें किसी भी कानूनी एकल अभिव्यक्ति का उपयोग करके संयोजित कर सकते हैं। यह मूल रूप से वही नियम है जो किसी फ़ंक्शन कॉल को प्रदान की गई किसी भी अन्य इनलाइन अभिव्यक्ति पर लागू होता है, सिवाय इसके कि आपको कक्षा के किसी भी सदस्य (चूंकि इसे अभी तक नहीं बनाया गया है) का उपयोग करना चाहिए और स्वयं को स्थिरांक और पास-थ्रू पैरामीटर तक सीमित करना चाहिए:

public foo (Uri someUrl) 
{ 
    this.url = someUrl; 
} 

public foo (string path, string query) 
    : this(new Uri(String.Concat(path, query))) 
{ 
    // this.url is now set and available. 
} 

यह प्रसंस्करण तुम क्या करने के लिए एक एकल महत्वपूर्ण अभिव्यक्ति में किया जा सकता की जरूरत के रूप में रूप में लंबे समय से काम करेगा। यदि आपको अन्य रचनाकार को भेजे जाने से पहले Uri के साथ कुछ और करने की आवश्यकता है, या यदि आपको कुछ जटिल/यदि तर्क की आवश्यकता है, तो आप इस तकनीक से दूर नहीं जा पाएंगे। , तो आप उन्हें अपने साथ पार करने से पहले अपने तार संसाधित कर रहे हैं के बाद से

class Frob 
{ 
    public Frob (Uri uri) 
    { 

    } 

    public Frob(string path, string query) 
     : this(TidyUpUri(path, query)) 
    { 

    } 

    private static Uri TidyUpUri(string path, string query) 
    { 
     var uri = new Uri(string.Concat(path, query)); 

     // etc. 

     return uri; 
    } 
} 
+1

माइनर नाइटपिक, लेकिन संभवतः 'init' निजी बनाना बेहतर है। –

+0

मुझे यह मिल गया! अगर मेरे पास अधिक जटिल चेनिंग आवश्यकताएं हैं, तो मैं अगली बार एक इनिट सेट अप करूंगा। धन्यवाद! –

2

आप एक को निकाल सकते हैं:

public foo (Uri someUrl) 
{ 
    this.init(someUrl); 
} 

public foo (string path, string query) 
{ 
    var url = String.Concat(path, query); 
    url = url.Replace("http://", "https://"); 

    this.init(url); 
} 

private void init (Uri someUrl) 
{ 
    this.url = someUrl; 
} 
संबंधित मुद्दे