2013-05-23 9 views
7

मेरे पास एक ऐसी स्थिति है जहां मैं सिर्फ एक विधि अधिभार के लिए वापसी प्रकार अलग होना चाहता हूं, लेकिन आप इसे सी # में नहीं कर सकते हैं।सी # अधिभार वापसी प्रकार - अनुशंसित दृष्टिकोण

सबसे अच्छा तरीका यह संभाल करने के लिए क्या है? क्या यह तथ्य है कि मुझे इसका मतलब है कि मेरी प्रोग्राम संरचना त्रुटिपूर्ण है?

इस तथ्य को देखते हुए कि यह सी # में असंभव है, अनुशंसित दृष्टिकोण क्या है?

+0

विधि क्या करती है? –

+0

डेटा की एक सूची पुनर्प्राप्त करता है, या तो एक लिंक्डलिस्ट या शब्दकोश के रूप में। – richard

+0

'var' कीवर्ड के आगमन के साथ, अस्पष्टता के बिना इसे लागू करना असंभव है। देखें [फ़ंक्शन-ओवरलोडिंग-बाय-रिटर्न-टाइप] (http://stackoverflow.com/questions/442026/function-overloading-by-return-type) – nawfal

उत्तर

18

आमतौर पर आप विधियों को अलग-अलग नाम देते हैं। खासकर यदि आप तो कर रहे हैं एक बुला -

इस का एक उदाहरण GetInt32 साथ IDataReader, GetInt64 आदि

ईमानदारी से कहूं तो मेरा मानना ​​है कि यह आम तौर पर यह स्पष्ट तुम वैसे भी ऐसा करने के लिए कोशिश कर रहे हैं क्या बनाता है परिणाम के साथ ओवरलोडेड विधि:

Console.WriteLine(reader.GetInt32()); // This is clear 

Console.WriteLine(foo.OverloadedGet()); // Which overload of OverloadedGet? 
+1

उत्तर के रूप में स्वीकृत क्योंकि तथ्य यह है कि नाम बदलने से यह स्पष्ट हो जाता है मुझे इसकी तलाश थी। – richard

7

इस तथ्य को देखते हुए कि यह सी # में असंभव है, अनुशंसित दृष्टिकोण क्या है?

यह इस बात पर निर्भर करता है कि आपको इसकी आवश्यकता क्यों है।

सबसे आम तरीका सिर्फ एक अलग नाम का उपयोग करना है। ढांचा कई मामलों में करता है, जैसे कि Convert class

आप कई प्रकार के समर्थन करना चाहते हैं, तो आप सामान्य तरीकों के माध्यम से ऐसा कर सकते हैं:

T SomeMethod<T>() 
    // Optionally add constraints:" 
    where T : IFoo 
{ 

सामान्य विधि दृष्टिकोण, repostories के लिए आम है के रूप में यह है कि आधार वर्ग के एक "संस्था" का प्रकार आम है।

2

आपके पास रिटर्न प्रकार निर्दिष्ट करने वाला एक और पैरामीटर हो सकता है।

public static T[] Method1<T>(int i, T type) 
{ 
    return new T[i]; 
} 
+0

इस काम के लिए आपको 'टी टाइप' पैरामीटर की आवश्यकता नहीं है। इसके लिए कोई आवश्यकता नहीं है क्योंकि आप इसका उपयोग नहीं कर रहे हैं;) –

+0

@ReedCopsey यह मुझे यह करने की अनुमति देता है: 'string [] s1 = method1 (3," a "); 'स्ट्रिंग [] s2 = method1 (3 के बजाय'); '। (कोई बड़ा सौदा नहीं। मुझे पता है।) – ispiro

+0

@ReedCopsey अब मैं देखता हूं कि आपके पास इस प्रकार का जवाब है। जवाब देने पर, मैंने अभी आपके उत्तर की शुरुआत देखी, इसलिए मैंने उसे नोटिस नहीं किया। – ispiro

1

मैं पहले से ही एक उत्तर भेजा है, लेकिन यहाँ एक और तरीका है: का उपयोग object की।

object TheMethod(MyEnum type) 
{ 
    if (type == MyEnum.A) return (object)SubMethod1(); 
    else if (type == MyEnum.B) return (object)SubMethod2(); 
    //... 
} 

int SubMethod1() { return 1; } 
string SubMethod2() { return "a"; } 

और परिणाम उचित प्रकार पर डालें।

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