मुझे यकीन है कि यह पहले पूछे जाने चाहिए लेकिन मुझे ऐसा ही उदाहरण नहीं मिल रहा है। मैं अच्छी तरह से polymorphism और विधि overloading समझता हूं, लेकिन यहां एक समाधान के साथ एक साधारण सरल परिदृश्य है जो मुझे बचता है:पॉलिमॉर्फिज्म-पैरामीटर की तरह हैंडलिंग - सरल ओओ?
मान लें कि मेरे पास कई व्युत्पन्न कक्षाओं के साथ बेस क्लास है। मैं इस उदाहरण
base Shape
derived Circle extends Shape
derived LineSeg extends Shape
आदि के लिए आकार का उपयोग करेगा
अब, आकार एक विधि कहा जाता है एक दूसरे को काटना (अन्य) है कि एक और आकार के खिलाफ परीक्षण अगर वे एक दूसरे को काटना देखने के लिए। पॉलिमॉर्फिज्म के साथ यह देखना आसान है कि कैसे सर्किल, लाइनसेग इत्यादि, अपने स्वयं के "छेड़छाड़" तरीकों को कार्यान्वित कर सकते हैं, और विधि अधिभार के साथ, मैं आसानी से सभी आवश्यक संयोजनों को कार्यान्वित कर सकता हूं। उदाहरण के लिए,
Circle.intersect(LineSeg)
Circle.intersect(Circle)
LineSeg.intersect(Circle)
आदि
अब तक तो अच्छा।
समस्या है, अगर मैं आकार की एक केंद्रीय सूची रखने के लिए, मैं ऐसा करना चाहते हैं:
for some shape s
Foreach shape in Shapes
if (s.intersect(shape)) - do something
वर्तमान में, मुझे यकीन है कि यह कैसे संभव है, के बाद से विधि ओवरलोडिंग "एक दूसरे को काटना" का चयन करता है नहीं कर रहा हूँ आधार प्रकार आकार से मिलान करने के लिए विधि, और उपयुक्त पैरामीटर प्रकार नहीं। मैं इसे बिना किसी और-श्रृंखला के प्रकार और डाउन-कास्टिंग की जांच कैसे कर सकता हूं?
बीटीडब्ल्यू, मैं जावा का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि भाषा पूरी तरह प्रासंगिक है क्योंकि यह मूलभूत डिजाइन प्रश्न प्रतीत होता है। बहुत आसान लगता है, मुझे क्या याद आ रही है?
धन्यवाद!
नीचे हल (धन्यवाद!), वहां विवरण देखें। असल में, व्युत्पन्न कक्षाओं में कॉलबैक करके, जो उचित विधि (विज़िटर पैटर्न?) कहता है, आप उचित अंतरण विधि का आह्वान करने के लिए "इस" कीवर्ड का उपयोग कर सकते हैं, क्योंकि इसमें उचित प्रकार की आवश्यकता है।
कुछ प्रोग्रामिंग भाषाओं और सीधे तर्क 'क्रम प्रकारों पर अधिक भार समर्थन करते हैं।उदाहरण के लिए, LISP * multimethods * का समर्थन करता है, और मुझे लगता है कि कुछ कार्यात्मक प्रोग्रामिंग भाषाएं इसका समर्थन करती हैं। जावा में, इसे आमतौर पर * डबल प्रेषण * कहा जाता है, और गोफ विज़िटर पैटर्न जाने का तरीका है। –
अपने डिज़ाइन को कम करने के लिए नहीं, लेकिन आपकी विरासत थोड़ा गलत है। रेखा खंड वास्तव में आकार नहीं हैं। वे आकार बनाते हैं। आप आकृति, रेखा खंडों के आधार पर कई में से किसी एक के चौराहे की जांच करेंगे, जो प्रश्न में दो आकार बनाते हैं :) – ChiefTwoPencils
@ सीएलएंग, अच्छी पकड़, लेकिन अगर मैं "दीवार" में लाइनसेग का नाम बदलूं तो क्या होगा? मूल रूप से इसका उपयोग कैसे किया जाता है, लेकिन इसे लाइन को कॉल करने से एसईजी इसे अन्य जटिल आकारों में उपयोग करके अवधारणा को आसान बनाता है – user1922401