2011-03-09 14 views
5

मैं सोच रहा था कि क्या इस कोड में सुधार किया जा सकता है। IProvider IProvider लागू करता है और ओवरराइट अनुरोध (...)। मैं इन्हें एक इंटरफ़ेस में जोड़ना चाहता हूं। लेकिन मुझे अभी भी काम करने के लिए एक टाइप और अवांछित इंटरफ़ेस की आवश्यकता है।क्या गैर-जेनेरिक इंटरफेस को परिभाषित करना संभव है जिसमें सामान्य तरीके हो सकते हैं?

इन संयोजित करने का उपाय है जहाँ मैं दोनों मिल है या इस इंटरफेस देखना चाहिए कि कैसे है?

public interface IProvider 
{ 
    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 
} 

public interface IProvider<T> : IProvider 
{ 
    new IResult<T> Request(IQuery request); 
} 
+0

मैं तुम लोगों निर्देशों का पालन किया और कहा कि काम के रूप में मैं चाहता था। मैं केवल 1 विजेता दे सकता हूं। माफ़ कीजिये। – phillip

+0

अगली बार जब आप बॉस को "सबसे पुराना" चेक करना चाहते हैं। – VulgarBinary

+0

आपने उसके बाद अपना संपादन किया, यही कारण है कि उसे चेक मिल गया। – phillip

उत्तर

5

तो सामान्य प्रकार पैरामीटर TRequest विधि के संदर्भ में ही प्रासंगिक है, सामान्य रूप में ही नहीं प्रणाली की घोषणा:

public interface IProvider 
{ 
    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 

    IResult<T> Request<T>(IQuery request); 
} 
+0

ठीक है। यह जानना अच्छा है ... धन्यवाद। – phillip

+0

जो भी मुझे नीचे मतदान करता है: यह बेकार है, अगर आप व्याख्या नहीं करते हैं, तो आपने ऐसा क्यों किया! खासकर, जवाब के बाद ही स्वीकार कर लिया गया है ...! –

+0

मुझे लगता है कि यह वल्गारबाइनरी था ... वह इस बारे में बता रहा था कि उसका जवाब कैसे उठाया जाना चाहिए था और अब उसका रान हटा दिया गया है। मुझे लगता है कि एक और सदस्य सिर्फ अपनी अनावश्यक टिप्पणियों को हटा सकता था - यकीन नहीं। – phillip

2

आप क्षमता untyped कोड निष्पादित करने के लिए आप एक सामान्य वर्ग के भीतर उस विधि नहीं डाल सकते है (और यह अभी भी समझ में डिजाइन बुद्धिमान बनाने के लिए) चाहते हैं। तो जवाब नहीं है ... जब आपके पास अवांछित और टाइप किए गए इंटरफेस की आवश्यकता होती है तो आपके पास सही दृष्टिकोण है।

हालांकि आप प्रारंभिक इंटरफेस के लिए एक संदर्भ है या उन्हें एक ही इंटरफ़ेस में रोल कर सकते हैं, लेकिन अपने untyped तरीकों अभी भी होगा एक सामान्य वर्ग के भीतर घोषित करने, अर्थात्:

ObjectProvider<SomeObjectType> j = new ObjectProvider<SomeObjectType>(); 
j.DataSource = //Do something 

अब, आप हमेशा एक सामान्य विधि के रूप में अनुरोध निर्दिष्ट कर सकते हैं और दोनों एक ही संदर्भ में मौजूद होने की अनुमति दे सकते हैं ... लेकिन ... यह आपके अंत में है।

public interface IProvider 
{ 
    IResult<T> Request<T>(IQuery request); 

    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 
} 
+0

अच्छा जवाब। उत्तर के लिए धन्यवाद। – phillip

0

वास्तव में, इंटरफ़ेस को लागू करने का मतलब है आप छोड़ रहे हैं आधार इंटरफेस के बच्चे में भी सदस्य - विरासत इस तरह से काम करता है।

तो, क्या होगा जब आप अपने बच्चे (सामान्य) कुछ वर्ग द्वारा इंटरफ़ेस को लागू? राउज़ के आपको कार्यान्वयन वर्ग में सामान्य और गैर-जेनेरिक दोनों सदस्य मिलेंगे, जो वास्तव में आप समझना नहीं चाहते हैं।

समाधान:

  1. घोषित आधार इंटरफेस (जैसे IProviderBase) युक्त "डेटा स्रोत" और "विन्यास" केवल सदस्य हैं।
  2. IProvider IProviderBase के बच्चे बनाने के लिए और() गैर सामान्य अनुरोध की घोषणा उस में।
  3. IProvider < टी > आईपीरोवाइडरबेस के बच्चे को बनाते हैं और जेनेरिक अनुरोध < टी >() में घोषणा करते हैं।

भावना बनाता है?

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

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