सी # सामान्य "जहां" किसी भी सामान्य प्रकार "परिभाषा के साथ बाधा"?


113

मुझे उदाहरण दें:

  1. मेरे पास कुछ सामान्य वर्ग / इंटरफ़ेस परिभाषा है:

    interface IGenericCar< T > {...}

  2. मेरे पास एक और वर्ग / इंटरफ़ेस है जिसे मैं ऊपर की कक्षा के साथ संबंधित करना चाहता हूं, उदाहरण के लिए:

    interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}

मूल रूप से, मैं चाहता हूं कि मेरा जेनेरिक IGarrage निर्भर हो IGenericCar, भले ही वह हो IGenericCar<int>या नहीं IGenericCar<System.Color>, क्योंकि मुझे उस प्रकार पर कोई निर्भरता नहीं है।

जवाबों:


142

इसे प्राप्त करने के आम तौर पर 2 तरीके हैं।

Option1 : एक और पैरामीटर जोड़ें जो यह IGarrageदर्शाता है Tकि IGenericCar<T>बाधा में पारित किया जाना चाहिए :

interface IGarrage<TCar,TOther> where TCar : IGenericCar<TOther> { ... }

Option2 : एक आधार इंटरफ़ेस को परिभाषित करें IGenericCar<T>जिसके लिए सामान्य नहीं है और उस इंटरफ़ेस के खिलाफ विवश है

interface IGenericCar { ... }
interface IGenericCar<T> : IGenericCar { ... }
interface IGarrage<TCar> where TCar : IGenericCar { ... }

6
ठीक है, लेकिन मैं क्या अगर मैं अपने सामान्य प्रकार का उपयोग करना करना चाहिए Tअंदर IGarage<TCar>? मैं विकल्प 2 में कोई संभावना नहीं देख सकता। सबसे अच्छा समाधान होगा यदि IGarage<TCar>प्रकार Tका विश्लेषण करके पाया जाता है TCar
pt12lol

2
पोस्टरिटी के लिए, एक प्रकार बनाया जा सकता है जिसमें कच्चे जेनेरिक प्रकार का एक पैरामीटर होता है, लेकिन केवल रनटाइम पर प्रतिबिंब के साथ, और निर्मित वर्ग का निर्माण कभी नहीं किया जा सकता है, क्योंकि कच्चे जेनेरिक प्रकार के पैरामीटर का निर्माण पूर्ण परिभाषा के बिना स्वचालित रूप से कभी नहीं किया जा सकता है। ITS संबंधित प्रकार के पैरामीटर। मैं नहीं देखता कि यह कहाँ उपयोगी हो सकता है, सिवाय उन मामलों के जिनमें सबसे बाहरी वर्ग के सुपर-जेनरिक स्थैतिक सदस्य हैं (अर्थात IGarage<IGenericCar<?>>.TellMeAboutCarsInGeneral(), जो शायद खराब डिज़ाइन का परिणाम होगा), लेकिन मैंने इसे अपने टिंकरिंग में किया है, और यह संभव है।
माइकल हॉफमैन

मुझे लगता है कि कोई भी वर्ग में IGenericCar इंटरफ़ेस जोड़ सकता है और एक अप्रत्याशित कक्षा के साथ विवश विधि को तोड़ सकता है।
एन-

2
@ pt12lol: यदि IGarrage<TCar>वास्तव में अंतर्निहित जेनेरिक प्रकार (जैसे यह उक्त प्रकार की संपत्ति को संभालता है) को संभालता है, तो उसे उस प्रकार को जानना होगा, जिसके लिए आपको टाइप को निर्दिष्ट करने की आवश्यकता है, जो कि विकल्प 1 (केवल तभी व्यवहार्य विकल्प) है। हालांकि, अगर IGarrage<TCar>सीधे अंतर्निहित जेनेरिक प्रकार (सभी IGarrage<TCar>कोड इस अंतर्निहित प्रकार के अज्ञेयवादी को संभाल नहीं करता है ), तो विकल्प 2 मान्य है।
फ्लैटर

6

क्या ऐसा करने का कोई मतलब होगा:

interface IGenericCar< T > {...}
interface IGarrage< TCar, TCarType > 
    where TCar: IGenericCar< TCarType > {...}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.