मुझे कुछ विरासत समस्याएं हैं क्योंकि मुझे अंतर-संबंधित अमूर्त वर्गों का एक समूह मिला है जिसे क्लाइंट कार्यान्वयन के लिए सभी को एक साथ ओवरराइड करने की आवश्यकता है। आदर्श रूप में मैं निम्नलिखित की तरह कुछ करना चाहते हैं:विरासत क्यों काम नहीं करती है जिस तरह से मुझे लगता है कि इसे काम करना चाहिए?
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
यह किसी कुत्ते वर्ग का उपयोग कर स्वचालित रूप से DogLegs और पशु वर्ग का उपयोग कर पैर पाने के लिए किसी को भी प्राप्त करने की अनुमति होगी। समस्या यह है कि ओवरराइड फ़ंक्शन को बेस क्लास के समान प्रकार होना चाहिए, इसलिए यह संकलित नहीं होगा। मुझे नहीं लगता कि यह क्यों नहीं होना चाहिए, क्योंकि डॉगलेग पैर के लिए पूरी तरह से जाली योग्य है। मुझे पता है कि इसके चारों ओर बहुत सारे तरीके हैं, लेकिन मैं अधिक उत्सुक हूं कि यह सी # में क्यों संभव नहीं है।
EDIT: मैंने इसे कुछ हद तक संशोधित किया, क्योंकि मैं वास्तव में अपने कोड में कार्यों के बजाय गुणों का उपयोग कर रहा हूं।
संपादित: मैं इसे वापस कार्यों के लिए, बदल क्योंकि उत्तर केवल (एक संपत्ति के सेट समारोह नहीं काम करना चाहिए का मूल्य पैरामीटर पर सहप्रसरण) है कि स्थिति के लिए लागू होता है। उतार-चढ़ाव के लिए खेद है! मुझे एहसास है कि यह बहुत सारे जवाब अप्रासंगिक लगता है।
भिन्नता पर आपका बयान समझ में नहीं आता है। उपप्रकार में: कोविरिएंस = संबंधित प्रकार उपप्रकार और Contravariance = संबंधित प्रकार supertyped हो रही है। यह प्रश्न एक covariant (उप प्रकार का उपप्रकार में उपयोग किया जाता है) रिटर्न प्रकार का प्रतिनिधित्व करता है, जब सी # केवल एक invariant (समान) वापसी प्रकार की अनुमति देता है। –
जिन लेखों से आप जुड़े हैं वे जेनेरिक प्रकार भिन्नता के बारे में हैं। प्रश्न वापसी प्रकार covariance के बारे में है। मैं उन लेखों में स्पष्ट रूप से बताता हूं कि मैं वापसी प्रकार के बारे में बात नहीं कर रहा हूं। –
एरिक लिपर्ट: लेकिन उन चीजें आंतरिक रूप से जुड़े हुए हैं। यहां देखें: http://apocalisp.wordpress.com/2009/08/27/hostility-toward-subtyping/ – Apocalisp