2013-06-09 15 views
8

मान लें कि आपके पास एक कक्षा है जिसमें टी का उपयोग करने के तरीके हैं। और आपके पास एक ही नाम के मानक तरीके भी हैं।जेनेरिक विधि हस्ताक्षर और मानक हस्ताक्षर समान

क्या होता है यदि टी मानक विधि के समान प्रकार का होता है? मानक विधि कहा जाता है।

क्या टी-विधि को कॉल करने के लिए उसे मजबूर करने का कोई तरीका है?

सिस्टम का उपयोग कर;

namespace ConsoleApplication3 
{ 
class Program 
{ 
    static void Main() 
    { 
     Generics<Int32> anInt = new Generics<Int32>(4); 
     Generics<String> aString = new Generics<String>("test"); 
    } 
} 

public class Generics<T> 
{ 
    public T Member; 

    public String ErrorMessage; 

    public Generics(T member) 
    { 
     this.Member = member; 
    } 

    public Generics(String errorMessage) 
    { 
     this.ErrorMessage = errorMessage; 
    } 
} 
} 
+2

क्या आपने यह जांच की थी (http://blogs.msdn.com/b/jaredpar/archive/2008/04/14/gotcha-generic-overload-resolution-hehe n-called-generically.aspx) बाहर? – sq33G

+0

यदि आप जानते हैं कि एक ही नाम की विधि पहले से मौजूद है तो आपको अपनी विधि का नाम बदलना चाहिए, अपने कोड को विरासत में लाने वाले अन्य प्रोग्रामर की कल्पना करें। – Sayse

+0

धन्यवाद, sq33G, अब मैं समझता हूं कि इसे कैसे बाधित किया जाए। मैं अपना मामला थोड़ा अलग चला गया। मैंने जेनेरिक से व्युत्पन्न किया और मुझे रचनाकारों को लिखा जो इसे सही तरीके से संभालते हैं। –

उत्तर

5

क्षमा करें, ऐसा नहीं है।

सबसे आसान समाधान व्यवहार में अंतर को इंगित करने के लिए दो अलग-अलग विधि नामों का उपयोग करना है। चूंकि प्रश्न में विधि नाम निर्माता हैं, इसलिए आपके नाम पर कोई नियंत्रण नहीं है, इसलिए आपको उनमें से कम से कम एक को सामान्य विधि में बदलना होगा। उदाहरण के लिए:

public class Generics<T> 
{ 
    public T Member; 

    public String ErrorMessage; 

    public Generics(T member) 
    { 
     this.Member = member; 
    } 

    private Generics() 
    { 
     // empty constructor just to allow the class to create itself internally 
    } 

    public static Generics<T> FromError(String errorMessage) 
    { 
     return new Generics<T> { ErrorMessage = errorMessage }; 
    } 
} 

व्यक्तिगत तौर पर मैं दोनों कंस्ट्रक्टर्स बदलने के लिए, स्थिर तरीकों होने के लिए इतना है कि व्यवहार में अंतर उपयोगकर्ता के लिए पूरी तरह से स्पष्ट कर दिया है होगा। हालांकि, अगर आप केवल एक कन्स्ट्रक्टर बदलते हैं, तो इसे त्रुटि दें।

1

ठीक है, मैं एक टिप्पणी में अपनी टिप्पणी कर दूंगा।

सबसे पहले, ऐसा मत करो। ऐसा न करें। आप चाहते हैं कि इंसान सिर्फ आपके कंप्यूटर को न पढ़ सकें, न सिर्फ कंप्यूटर। (वहां, मैंने सी # प्रोग्रामर स्पेस के सदस्य के रूप में अपना कर्तव्य किया है)

दूसरा।

रूप here वर्णित:

आप अपने कोड डिजाइन यदि ऐसा है कि संकलक जब यह संकलन है आप के साथ, आप सामान्य विधि का उपयोग करने के लिए इसे मजबूर कर सकते हैं कॉल कर रहे हैं कि किस प्रकार नहीं बता सकता।

static Generics<T> Test<T> (T parameterToTest) { 
    return new Generics<T>(parameterToTest); 
} 

static void Main() 
{ 
    Generics<Int32> anInt = Test<Int32>(4); 
    Generics<String> aString = Test<String>("test"); 
} 
0

मैं बस ऐसा किया (इस विशिष्ट मामले के लिए):

मैं

protected Generics() { } 

जेनेरिक्स

को एक खाली संरक्षित निर्माता जोड़ा और फिर मैं टी के = स्ट्रिंग

विशिष्ट मामले के लिए ली गई
public class GenericsOfString : Generics<String> 
    { 
     public GenericsOfString(String text, Boolean isErrorMessage) 
     { 
      if (isErrorMessage) 
      { 
       this.ErrorMessage = text; 
      } 
      else 
      { 
       this.Member = text; 
      } 
     } 
    } 
संबंधित मुद्दे