2016-05-17 5 views
5

इस वर्ग पर विचार करें:क्या कक्षा का इंटरफ़ेस contravariant है, जेनेरिक संदर्भ प्रकार पैरामीटर का उपयोग करने का कोई फायदा है?

class MyClass<T> where T: class // or T: BaseClass 
{ 
    void DoSomething1(T arg){ ... } 
    void DoSomething2(T arg){ ... } 
    ... 
    void DoSomethingN(T arg){ ... } 
} 

और वहाँ T मूल्यों की कोई वापसी है! संरक्षित संपत्ति या क्षेत्र में भी, इसलिए वंशज T वापस नहीं लौट सकते हैं।

क्या यहां हार्डकोडेड बेस क्लास प्रकार की तुलना में जेनेरिक पैरामीटर का उपयोग करने का कोई फायदा है?

+1

मुझे समस्या/प्रश्न यहां नहीं दिखाई देता है। आप 'टी' वापस करने के लिए कार्य क्यों करना चाहते हैं? 'टी' पैरामीटर के रूप में प्रयोग किया जाता है। आपके उदाहरण में बाधा 'टी' की 'रेफरेंसियल' क्षमता को संदर्भित करती है। यदि आप 'टी: बेस क्लास' चुनते हैं तो जेनेरिक पैरामीटर का उपयोग करने के लिए कोई उपयोग नहीं किया जा सकता है। – ckruczek

+0

मैं नहीं कहूंगा, क्योंकि मुझे ठोस प्रकार का उपयोग करने के लिए कोई सकारात्मकता दिखाई नहीं दे रही है - अगर इसका उपयोग नहीं किया जा सकता है, तो इसे परिभाषित करने में कोई मूल्य नहीं है। – JanDotNet

+0

@ जेएनएस हो सकता है अनुकूलन के लिए कुछ जगह हो। यदि टी एक सीलबंद कक्षा है तो संकलक वीएमटी की आवश्यकता के बिना कॉल को उत्सर्जित कर सकता है? –

उत्तर

0

नहीं, इसका कोई फायदा नहीं है। चूंकि आप केवल T के पैरामीटर पास करते हैं, इसलिए आपकी विधियां अनिवार्य रूप से contravariant हैं, इसलिए आप उन्हें T के बजाय BaseClass संदर्भ लेने के लिए घोषित कर सकते हैं।

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

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