ठीक है, के IContainer<T>
साथ Aquarium
साथ IAnimal
साथ Fish
साथ A
, IA
, B
, और IB<T>
की जगह करते हैं। - foo एक कंटेनर है कि किसी भी जानवर शामिल कर सकते हैं के रूप में लिखा गया
// Model
public class Fish : IAnimal { }
public class Tiger : IAnimal { }
// ModelLogic
public class Aquarium : IContainer<Fish>
{
public Fish Contents { get; set; }
}
// Model Interface
public interface IAnimal { }
// ModelLogic Interface
public interface IContainer<T> where T : IAnimal
{
T Contents { get; set; }
}
IContainer<IAnimal> foo = new Aquarium(); // Why is this illegal?
foo.Contents = new Tiger(); // Because this is legal!
आप foo में एक टाइगर रख सकते हैं: और हम IContainer<T>
के एक सदस्य है, और IAnimal
की एक दूसरी कार्यान्वयन जोड़ देंगे। लेकिन आप केवल एक मछली को एक्वेरियम में डाल सकते हैं। चूंकि ऑपरेशंस आप Aquarium
पर कानूनी रूप से प्रदर्शन कर सकते हैं IContainer<IAnimal>
पर किए जा सकने वाले कार्यों की तुलना में अलग-अलग हैं, तो प्रकार संगत नहीं हैं।
सुविधा आप चाहते हैं सामान्य इंटरफ़ेस सहप्रसरण कहा जाता है और यह सी # 4 द्वारा समर्थित है, लेकिन आप संकलक है कि आप अपने मछली टैंक में एक बाघ डाल कभी नहीं होगा करने के लिए साबित करना है। आप क्या करना चाहते हैं: IB
पर
// Model
public class A : IA { }
// ModelLogic
public class B : IB<A> { }
// Model Interface
public interface IA { }
// ModelLogic Interface
public interface IB<out T> where T : IA { }
सूचना सहप्रसरण एनोटेशन। यह out
का अर्थ है कि T
केवल आउटपुट के रूप में उपयोग किया जा सकता है, इनपुट के रूप में नहीं। यदि T
केवल एक आउटपुट है तो किसी मछली के टैंक में बाघ डालने का कोई तरीका नहीं है क्योंकि वहां "संपत्ति" या विधि संभव नहीं है।
मैंने कई ब्लॉग लेख लिखे थे जबकि हम उस सुविधा को सी # में जोड़ रहे थे; यदि आप डिजाइन संबंधी कि सुविधा में चला गया में रुचि रखते हैं, देखें:
http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/
स्रोत
2012-04-27 14:41:16
सी # का कौन सा संस्करण आप उपयोग कर रहे हैं? – Oded
[कोविरिएंस और कंट्रावायरेंस अकसर किये गए सवाल] (http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx) और [यह ब्लॉग श्रृंखला] (http:/एरिक लिपर्ट – Oded
बी द्वारा /blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/) बीबी एक आईबी है, आईबी नहीं। –
Servy