2012-11-06 26 views
10

मैं कुछ ठोस जो इंटरफेस निम्न प्रकारफैक्टरी वर्ग एक सामान्य इंटरफ़ेस लौटने

interface IActivity<T> 
{ 
    bool Process(T inputInfo); 
} 

कंक्रीट वर्ग के रूप में

class ReportActivityManager :IActivity<DataTable> 
{ 
    public bool Process(DataTable inputInfo) 
    { 
     // Some coding here 
    } 
} 

class AnalyzerActivityManager :IActivity<string[]> 
{ 
    public bool Process(string[] inputInfo) 
    { 
     // Some coding here 
    } 
} 

इस प्रकार अब की तरह हैं मैं कैसे कारखाने वर्ग जो retuns लिख सकते हैं का उपयोग करता है एक सामान्य इंटरफ़ेस IActivity जैसी कुछ चीज़।

class Factory 
{ 
    public IActivity<T> Get(string module) 
    { 
     // ... How can i code here 
    } 
} 

धन्यवाद

+0

हो रही त्रुटि .. त्रुटि CS0050: असंगत पहुँच: वापसी प्रकार – Anish

उत्तर

14

आप सामान्य विधि बनाना चाहिए अन्यथा संकलक वापसी मान में T के प्रकार पता नहीं चलेगा। आप होगा जब T आप T के प्रकार के आधार गतिविधि बनाने के लिए सक्षम हो जाएगा:

class Factory 
{ 
    public IActivity<T> GetActivity<T>() 
    { 
     Type type = typeof(T); 
     if (type == typeof(DataTable)) 
      return (IActivity<T>)new ReportActivityManager(); 
     // etc 
    } 
} 

उपयोग:

IActivity<DataTable> activity = factory.GetActivity<DataTable>(); 
+0

मैं एक त्रुटि "त्रुटि CS0050: असंगत पहुँच: वापसी प्रकार" हो रही है – Anish

+0

भी हो रही परोक्ष 'Factory.IActivity के प्रकार' Factory.ReportActivityManager 'कनवर्ट नहीं कर सकता '। एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं?) – Anish

+0

@ अनीश क्षमा करें, बस कास्टिंग जोड़ें। मैंने जवाब अपडेट किया है। –

1

अक्सर इस lazyberezovsky's answer में के रूप में कार्यान्वित किया जाता है। सी ++ में आप संकलक त्रुटियों को प्राप्त करने के लिए टेम्पलेट विशेषज्ञता का उपयोग कर सकते हैं जब आप फैक्ट्री को संभाल नहीं लेते हैं।

आप क्या कर सकते हैं नहीं है कि सी # में लेकिन तुम पास प्राप्त कर सकते हैं। हालांकि कोड थोड़ा आश्चर्यजनक लग सकता है जो बदले में एक समस्या हो सकती है।

public static class Factory { 
    public static IActivity<someType> Get(this someType self){ 
      //stuff specific to someType 
    } 

    public static IActivity<someOtherType> Get(someOtherType self){ 
      //stuff specific to someOtherType 
    } 

    public static T Creator<T>(){ 
     return null; 
    } 

} 

उपयोग तो

IActivity<someType> act = Factory.Creator<someType>().Get(); 
बेशक यह केवल काम करता है के

होगा यदि आप एक ठोस प्रकार पारित कर सकते हैं होगा। यदि आपको एक प्रकार पैरामीटर चीजें पास करने की आवश्यकता है तो अधिक जटिल हो जाएं।

+0

मैं सी # के साथ अच्छा नहीं हूं, लेकिन क्या यह सिर्फ एक निरीक्षण है कि दूसरा एक एक्सटेंशन विधि नहीं है? –

+0

इसके अलावा, "जब आप फ़ैक्टरी को एक प्रकार सौंपते हैं तो संकलक त्रुटियों को प्राप्त करने के लिए टाइप बाधाओं का उपयोग नहीं करते हैं, तो आप संकलक त्रुटियों को प्राप्त करने के लिए टेम्पलेट विशेषज्ञता का उपयोग कर सकते हैं" से निपटना चाहते हैं? –