2009-09-29 13 views
5

मान लें निम्न कोड के लिए एक पैरामीटर के रूप में एक सामान्य वर्ग पारित करने के लिए (कृपया अंतिम कक्षा में कोड टिप्पणी में मेरे सवाल पढ़ें):कैसे एक गैर सामान्य वर्ग निर्माता

//This is my Generic Class 
public class ClientRequestInfo<K, V> 
{ 
    public string Id { get; set; } 
    private Dictionary<K, V> parameters; 

    public ClientRequestInfo() 
    { 
     parameters = new Dictionary<K, V>(); 
    } 

    public void Add(K key, V value) 
    { 
     parameters.Add(key, value); 
    } 
} 

public class ProcessParameters() 
{ 
    private void CreateRequestAlpha() 
    { 
     ClientRequestInfo<int, string> info = new ClientRequestInfo<int, string>(); 
     info.Add(1, "Hello"); 
     SynchRequest s = new SynchRequest(info); 
     s.Execute(); 
    } 
    private void CreateRequestBeta() 
    { 
     ClientRequestInfo<int, bool> info = new ClientRequestInfo<int, bool>(); 
     info.Add(1, true); 
     SynchRequest s = new SynchRequest(info); 
     s.Execute(); 
    } 
} 

public class SynchRequest 
{ 
    //What type should I put here? 
    //I could declare the class as SynchRequest<K, V> but I don't want 
    //To make this class generic. 
    private ClientRequestInfo<????,?????> info; 
    private SynchRequest(ClientRequestInfo<?????,?????> requestInfo) 
    { 
     //Is this possible? 
     this.info = requestInfo; 
    } 

    public void Execute() 
    {} 
} 
+0

आप एक सामान्य SynchRequest का उपयोग क्यों नहीं करना चाहते हैं? – AnthonyWJones

+0

क्या आप जानकारी सदस्य के साथ निष्पादन() में क्या करेंगे, इसके बारे में बात कर सकते हैं? यह एक कार्यात्मक समकक्ष उत्तर के लिए आधार प्रदान कर सकता है। – joshperry

+0

क्योंकि क्लास SynchRequest को परियोजना के अन्य वर्गों द्वारा बुलाया जाता है और SynchRequest का उद्देश्य सेवा चलाने और क्लाइंट जानकारी के बारे में किसी भी प्रकार का प्रदान नहीं करना है। इसके अलावा ऐसे वर्ग भी हैं जो SynchRequest का उपयोग करते हैं और किसी क्लाइंट जानकारी को निर्दिष्ट या आवश्यकता नहीं देते हैं। तो इस वर्ग को सामान्य बनाने के लिए अच्छा दृष्टिकोण नहीं है। (SynchRequest में एक और खाली कन्स्ट्रक्टर है) – Ioannis

उत्तर

7

यदि आप SynchRequestInfo जेनेरिक नहीं बनाना चाहते हैं, तो क्या आप ClientRequestInfo के लिए एक गैर-जेनेरिक बेस क्लास बना सकते हैं? -

public abstract class ClientRequestInfo 
{ 
    public abstract void NonGenericMethod(); 
} 

public class ClientRequestInfo<K, V> : ClientRequestInfo 
{ 
    public override void NonGenericMethod() 
    { 
     // generic-specific implementation 
    } 
} 
फिर

:

public class SynchRequest 
{ 
    private ClientRequestInfo info; 

    private SynchRequest(ClientRequestInfo requestInfo) 
    { 
     this.info = requestInfo; 
    } 

    public void Execute() 
    { 
     // ADDED: for example 
     info.NonGenericMethod(); 
    } 
} 
+0

'CreateRequestAlpha' और' CreateRequestBeta' को कॉल करने में सक्षम होने के लिए 'Execute' विधि को निश्चित रूप से बेस क्लास में घोषित करने की आवश्यकता होगी। –

+0

'निष्पादन' 'SynchRequest' का हिस्सा है, न कि 'ClientRequestInfo'। –

2

वर्ग हो गया है सामान्य यदि आप जेनेरिक सदस्य चर चाहते हैं।

private ClientRequestInfo<????,?????> info; 

एक सामान्य सदस्य है।

आप एक गैर सामान्य आधार वर्ग या इंटरफ़ेस का उपयोग कर सकते हैं:

class ClientRequestInfo<K,Y> : IClientRequestInfo 

लेकिन अपने उदाहरण में, ClientRequestInfo किसी भी गैर सामान्य सदस्य नहीं है, इसलिए इंटरफ़ेस/आधार वर्ग खाली हो सकता है और होता है वैसे भी उपयोगी होने के लिए सही जेनेरिक संस्करण में डाला जा सकता है।

1

आपके पास दो विकल्प है, तो आप SynchRequestInfo सामान्य नहीं करना चाहते हैं।

  1. दोनों गैर-जेनेरिक बेस क्लास बनाएं, दोनों इसका उपयोग करें।
  2. ISynchInfo जैसे उपयोग करने के लिए एक इंटरफ़ेस प्रदान करें, और अपनी जेनेरिक क्लास इंटरफ़ेस को कार्यान्वित करें।

इस मामले में, मैं इंटरफ़ेस दृष्टिकोण पसंद करूंगा, क्योंकि आप भविष्य में अन्य प्रकारों (क्लाइंट अनुरोधों से अलग) को सिंक्रनाइज़ करना चाहते हैं।

1

क्लाइंटRequestInfo (के, वी) इंटरफ़ेस फ़ंक्शंस के साथ ClientRequestInfo इंटरफ़ेस को कार्यान्वित करें SynchRequest की आवश्यकता होगी।

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