मैं सी # 4.0 जेनरिक के साथ व्यस्त हो गया है, और अब मैं मूल रूप से इस तरह कुछ करना चाहता हूँ:सी # - क्या सामान्य संग्रह डालने का कोई तरीका है?
public abstract class GenericTree<T> : Tree
where T : Fruit
{
public Tree(IFruitCollection<T> fruits)
: base(fruits) { }
}
आधार ट्री वर्ग इस तरह दिखता है:
public abstract class Tree
{
private IFruitCollection<Fruit> fruits;
public IFruitCollection<Fruit> GetFruits
{
get { return fruits; }
}
public Tree(IFruitCollection<Fruit> fruits)
{
this.fruits = fruits;
}
}
यहाँ मेरी पहली समस्या है । जेनेरिक ट्री का कन्स्ट्रक्टर जेनेरिक संग्रह को फलों के संग्रह में नहीं डाल सकता है। मुझे जेनेरिक ट्री का कार्यान्वयन भी मिला है:
public class AppleTree : GenericTree<Apple>
{
public AppleTree()
: base(new FruitCollection<Apple>) { }
}
मेरी दूसरी समस्या यहां दी गई है। जब मैं AppleAree के उदाहरण में फल जोड़ता हूं, myAppleTree.GetFruits का उपयोग करके। जोड़ें (...), मैं केवल सेब तक ही सीमित नहीं हूं। मुझे सभी प्रकार के फल जोड़ने की अनुमति है। मुझे यह नहीं चाहिए।
मैं GenericTree को यह जोड़कर इस समस्या का समाधान करने की कोशिश की:
new public IFruitCollection<T> GetFruits
{
get { return base.GetFruits as IFruitCollection<T>; }
}
लेकिन यह या तो संभव नहीं है। यह किसी भी तरह से हमेशा शून्य देता है। यह संभव हो सकता है कि यह हल हो जाएगा, जब मेरी पहली समस्या हल हो जाएगी।
IFruitCollection इंटरफ़ेस इस तरह दिखता है:
public interface IFruitCollection<T> : ICollection<T>
where T : Fruit { ... }
और FruitCollection वर्ग संग्रह वर्ग के एक सरल कार्यान्वयन है। ओह, और निश्चित रूप से, ऐप्पल वर्ग फल वर्ग को बढ़ाता है।
समाधान IFruitCollection इंटरफेस को कॉन्वर्सिस और contravariance दोनों के साथ संगत बनाने के लिए है। लेकिन मैं इसे कैसे प्राप्त करूं? "इन" या "आउट" पैरामीटर कीवर्ड संभव नहीं हैं, क्योंकि आईसीओलेक्शन इंटरफेस इसे अनुमति नहीं देता है।
आपकी मदद के लिए बहुत बहुत धन्यवाद!
कृपया ध्यान दें कि यह आसानी से एक में ट्री और GenericTree वर्ग का विलय करके हल किया जा सकता। लेकिन याद रखें कि यह मेरी समस्या है कि यह केवल एक उदाहरण है। मेरा अपना आवेदन थोड़ा और जटिल है। –
जैसा कि आप इंगित करते हैं, समाधान ट्री जेनेरिक बनाना है। आप यह भी मानते हैं कि यह संभव नहीं है। क्यों नहीं? – phoog
किसी बिंदु पर, मुझे पेड़ की एक सूची की आवश्यकता है। और वृक्ष की एक सूची यह नहीं करती है, क्योंकि मुझे पेड़ उदाहरण जोड़ने की अनुमति नहीं है। यह निश्चित रूप से कहता है कि वृक्ष और वृक्ष के बीच कोई अंतर्निहित संदर्भ नहीं है। –