2012-06-08 12 views
7

मुझे इस विरासत प्रश्न का संतोषजनक उत्तर नहीं मिल रहा है। आप कभी-कभी इस तरह के उप प्रकार की घोषणा क्यों करते हैं:सी # उपclass घोषित करें सुपरक्लास

Shape myCircle = new Circle(); 

और यह अन्य बार?

Circle myShape = new Circle(); 

कहाँ सर्किल एक बच्चे/उप-वर्ग Shape की है .....

वहाँ OO किताबें मैं पढ़ रहा था और एक विवरण मैं भर में स्थिरता होना प्रतीत नहीं होता है मेरे सिर को चारों ओर मिल सकता है। लोगों ने मुझे एक आकार वर्ग के उदाहरण दिखाए हैं जो मंडल, वर्ग आदि के लिए तत्काल हैं ... लेकिन जब आप पहली घोषणा और दूसरे का उपयोग करते हैं तो मुझे समझ में नहीं आता है।

उत्तर

3

शायद आपके पास आकारों की एक सूची है, और आप विशेष रूप से परवाह नहीं करते कि वे किस प्रकार के आकार हैं क्योंकि आपको उस सूची के साथ क्या करना है, सभी आकारों (यानी ड्रा) के लिए सामान्य है, आप उन्हें जोड़ना चाहते हैं इस

List<Shape> shapeList = new List<Shape>(); 
shapeList.Add(new Circle()); 
shapeList.Add(new Rectangle()); 
foreach (Shape shape in shapeList) 
{ 
    shape.Draw(); 
} 

की तरह सूची इस तरह से आप वस्तुओं है कि वास्तव में विभिन्न प्रकार हैं पर आकार के सामान्य तरीके का उपयोग कर सकते हैं, लेकिन एक आम माता-पिता साझा करने के लिए। फिर यदि आप मंडलियों के लिए विशिष्ट कुछ करना चाहते हैं तो आप इस तरह की सूची का उपयोग कर सकते हैं।

foreach (Shape shape in shapeList) 
{ 
    if (!(shape is Circle)) continue; 
    Circle circle = shape as Circle; 
    circle.Radius = 100; 
} 
7

यह अक्सर विशेष प्रकार जहाँ आप उन्हें बचने कर सकते हैं पर निर्भरता बनाने से बचने के लिए ठोस वर्ग polymorphically की वस्तुओं के इलाज के लिए वांछनीय है। उदाहरण के लिए, यदि आप इसे चित्रित करने के इरादे से Circle बना रहे हैं, और Draw()Shape का एक तरीका है, तो myCircle को आकार के रूप में घोषित करना बेहतर होगा, यदि आप इसे बाद में एक वर्ग के साथ बदलने का निर्णय लेते हैं।

दूसरी ओर, यदि आपका इरादा Circle, कहने के लिए कुछ विशिष्ट करने के लिए, अपनी त्रिज्या सेट करने के लिए है, तो आप Circle रूप myCircle घोषित करने के लिए है, क्योंकि SetRadius()Shape पर उपलब्ध नहीं हो सकता की जरूरत है।

1

@dasblinkenlight के उत्तर के अतिरिक्त, आप दूसरे की बजाय पहली घोषणा का उपयोग करेंगे, क्योंकि आप myCircle ऑब्जेक्ट के Circle के सदस्यों के व्यवहार को प्रतिबंधित करना चाहते हैं।

ऐसा इसलिए है क्योंकि CircleShape का एक उपवर्ग है, और यह मतलब यह होगा कि सभी Shape के सदस्यों Circle द्वारा विरासत में मिला दिया जाएगा, और, कुछ मामलों में है, क्योंकि आप सी # का उपयोग कर रहे हैं (और सदस्यों अधिभावी हमेशा नहीं है नियम, जावा में की तरह), ओवरराइड।

आप विपरीत ऐसा नहीं कर सकते:

Circle myCircle = new Shape(); 

कारण here वर्णन किया गया है।

अन्यथा, आप दूसरी घोषणा उपयोग कर रहे हैं, myCircle एक Circle वस्तु हो जाएगा, सदस्यों और तरीकों Circle के उपलब्ध का उपयोग कर।

संबंधित मुद्दे