2008-11-07 14 views
5

के संबंध में कॉन्वर्सिस बनाम contravariance अवधारणाओं 'covariance' और 'contravariance' अवधारणाओं का अर्थ क्या है?वर्ग विरासत

को देखते हुए 2 कक्षाएं, पशु और हाथी (जो पशु से विरासत), मेरी समझ है कि आप, अगर आप कोशिश करते हैं और पशु की एक सरणी में एक हाथी डाल एक रन-टाइम त्रुटियों मिलेगा जाता है और ऐसा इसलिए होता है क्योंकि हाथी पशु से "बड़ा" (अधिक विशिष्ट) है। लेकिन क्या आप एक पशु को हाथी की एक सरणी में डाल सकते हैं, यह देखते हुए कि हाथी जानवरों को पशु गुणों को कैसे गारंटी दी जाती है?

+0

उपयोगी: http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx –

+0

[सहप्रसरण बनाम contravariance] (http://izlooite.blogspot.com/2011/04/covariance-and-contravariance.html) –

उत्तर

9

आप इसे पीछे की ओर है। आप एक हाथी को एक पशु सरणी में जोड़ सकते हैं क्योंकि यह एक पशु है, और यह गारंटी है कि एक पशु को आवश्यक सभी विधियों की आवश्यकता है। आप एक हाथी एरे में एक पशु नहीं जोड़ सकते हैं क्योंकि यह में हाथी की सभी विधियों की आवश्यकता नहीं है।

covariance and contravariance पर विकिपीडिया लेख इस का एक अच्छा व्याख्या है:

एक प्रोग्रामिंग भाषा के प्रकार प्रणाली के भीतर, प्रकार के प्रकार से एक ऑपरेटर covariant अगर यह आदेश को बरकरार रखता है, ≤, प्रकार की होती है, जो अधिक विशिष्ट लोगों से अधिक सामान्य लोगों के प्रकार का आदेश देता है; यह contravariant है अगर यह इस आदेश को उलट देता है। यदि इनमें से कोई भी लागू नहीं होता है, तो ऑपरेटर invariant है। ये शर्तें श्रेणी सिद्धांत से आती हैं।

इसके अलावा, आपने कहा कि टाइप एलिफेंट "बड़ा" था, और ऐसा नहीं है। टाइप करें पशु इस अर्थ में "बड़ा" है कि इसमें हाथी, जिराफ और शेर जैसे अधिक विशिष्ट प्रकार शामिल हैं।

+0

आह जो समझ में आता है तो क्या आप कहेंगे कि एक हाथी जानवर के लिए अनुकूल है लेकिन एक जानवर हाथी के लिए contravariant है? – alexmac

+0

यह इस बात पर निर्भर करता है कि आप किस प्रकार के साथ कर रहे हैं। हाथी के तरीकों को पशु या विधि के रूप में एक ही या संकुचित प्रकार को वापस करने की आवश्यकता होती है (यदि पशु विधि पशु लौटाती है तो वे पशु या हाथी लौट सकते हैं)। इसे कॉन्वेंट कहा जाएगा। –

+0

लेकिन हाथी के तरीकों के विधि पैरामीटर जानवरों के तरीकों से समान या व्यापक होने की आवश्यकता है। यह contravariance है। –

0

आपको Introducing .NET 4.0 With Visual Studio 2010 के 45-49 पृष्ठों को पढ़ने का प्रयास करना चाहिए जो इस सटीक उदाहरण से संबंधित हैं। इसमें हाथियों की कुछ अच्छी तस्वीरें भी हैं।

मुख्य बिंदु बाहर है लेने के लिए, करने के लिए इस

var things = new List<IThing<IContent>> { new ConcreteThing() } 

साथ:

public class ConcreteThing : IThing<ConcreteContent> 
{ 

} 

आप "बाहर" इंटरफ़ेस परिभाषा, जो और अधिक विशिष्ट रूपों हो सकेंगे में की जरूरत है सेट करें, लेकिन आईटिंग से बाहर पढ़ा गया कुछ भी सामान्य प्रकार होने की गारंटी दी जानी चाहिए।

public interface IThing<out T> where T : IContent 
{ 
} 
संबंधित मुद्दे