Polymorphism (not) broken with visitor pattern in C# (and new instead of override) -
मेरे पास निम्न कोड है:
वर्ग आगंतुक {आंतरिक वर्चुअल शून्य जाएँ (नोड n ) {}} वर्ग आगंतुक विशेष: आगंतुक {नोड एन} {}} वर्ग आधार {आंतरिक वर्चुअल शून्य स्वीकार (विज़िटर वी) {} आंतरिक वर्चुअल शून्य स्वीकार करें (विज़िटरविशेष v) {}} वर्ग नोड: बेस {आंतरिक ओवरराइड शून्य स्वीकार करें (विज़िटर v) {v.Visit (this); } आंतरिक ओवरराइड शून्य स्वीकार करें (विज़िटर विशेष v) {v.Visit (this); }}
क्या कोई कारण है कि स्वीकार करें (विज़िटर v)
पद्धति को चुना जाएगा जब new node () को कॉल करता है। स्वीकार करें (नया विज़िटर विशेष ( ))
अपडेट: ठीक है, मेरी बुरी, मुझे एहसास हुआ कि मैं ओवरराइड के बजाय आगंतुक में "नया" का प्रयोग कर रहा था। अब मुझे पता है क्यों "नया विघटन बहुरूपता" यह मेरे प्रश्न को पूरी तरह बेवकूफ बना देता है मदद के लिए धन्यवाद।
मुझे लगता है कि आप एक विशिष्ट भाषा (सी #?) के लिए सवाल पूछते हैं। तर्कसंगतता के अनुसार यह सबसे उपयुक्त अधिभार चुनने के लिए भाषा पर है (ध्यान दें: ओवरराइड नहीं!) यह फ़ंक्शन लुकअप के प्रकार पर निर्भर करता है जो इसका उपयोग करता है: स्थिर (संकलित-समय) या गतिशील (रन-टाइम)।
यदि आपकी भाषा स्थिर बाध्यकारी < / मजबूत>, यह शायद सबसे विशिष्ट कॉल चुन लेगा, इस मामले में, n.Accept (नया विज़िटर विशेष ())
दूसरे अधिभार को कॉल करेगा हालांकि,
विज़िटर v = नया विज़िटरविशेष (); एन। स्वीकार (वी);
स्थिर रूप से नोड :: स्वीकार करें (विज़िटर)
फ़ंक्शन के लिए बाध्य होगा।
यदि भाषा गतिशील बाइंडिंग का उपयोग करती है , यह तर्क के वास्तविक रनटाइम प्रकार के आधार पर कहा जाने वाला फ़ंक्शन चुन सकता है।
सामान्यतया, आप ओवरलोडिंग का उपयोग नहीं करके समूहीकृत कर सकते हैं काम के आसपास जो केवल वाक्यात्मक चीनी है: स्वीकार करें विजिटर
और AcceptSpecialVisitor
के बीच भेद करें। एक स्वीकार करें प्रबंधक
और स्वीकृति जस्टसइम्पेली
भी जोड़ें।
Comments
Post a Comment