2010-01-30 17 views
10

ठीक है - यह एक बहुत बेवकूफ सवाल हो सकता है, लेकिन यह मुझे परेशान कर रहा है।फ़ंक्शन पैरामीटर द्वारा पॉलीमोर्फिज्म

वहाँ एक भाषा जहां

class Animal; 
class Ape : public Animal 
{...} 

void doStuff(Animal* animalPtr) 
{ 
    cout << "doing animal stuff" << endl; 
} 

void doStuff(Ape* apePtr) 
{ 
    cout << "doing ape stuff" << endl; 
} 

Animal *ape = new Ape(); 
doStuff(ape); 

प्राप्त होते हैं "doing ape stuff" है? (कृपया सी ++ सिंटैक्स का उपयोग करके मेरे साथ भालू) स्पष्टीकरण के लिए, मैं चाहता हूं कि "एक ऐसा फ़ंक्शन जो तर्क स्वीकार करता है और तर्क के प्रकार के अनुसार कार्य करता है"।

और क्या यह समझ में आएगा? निस्संदेह, एक डेवलपर के रूप में आपको देखभाल करने की आवश्यकता होगी क्योंकि ऐसे उदाहरण जो एक पशु सूचक की तरह दिखते हैं, वास्तव में एप कोड को कॉल कर सकते हैं, क्योंकि रनटाइम पर यह एक ऐप उदाहरण की ओर इशारा किया जा रहा है।

उत्तर

7

हाँ, वहाँ हैं! इसे multiple dispatch कहा जाता है। विकिपीडिया लेख बहुत अच्छा है। अफसोस की बात है, ऐसा लगता है कि यह केवल सबसे लोकप्रिय भाषाओं के लिए भाषा एक्सटेंशन के माध्यम से समर्थित है, लेकिन कुछ (ज्यादातर गूढ़) भाषाएं हैं जो इसे मूल रूप से समर्थन देती हैं।

+0

सामान्य LISP ... यह आश्चर्य क्यों है (नहीं!);) शब्द स्पष्टीकरण और विकिपीडिया लिंक के लिए धन्यवाद! – msi

+0

मैं दूसरा आम lisp होगा। – Demosthenex

+0

इसे गूढ़ के रूप में वर्गीकृत करना लगभग दुखी है: -पी –

1

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

+0

पर एक नजर डालें, मुझे पता है कि सी ++ सुविधा मैं कर रहा हूँ "sorta" की तलाश में समर्थन नहीं करता। सी ++ में कोडिंग करते समय सोचा सिर्फ मेरे पास आया। क्या यह गतिशील/स्थैतिक भाषाओं के बीच अंतर बनाता है? – msi

+0

हां। गतिशील भाषा संकलन-समय के बजाय रनटाइम पर उनके प्रकार के चेक/विशेषता लुकअप करते हैं। यह उनके ऑपरेशन को थोड़ा धीमा कर देता है, लेकिन अधिक लचीलापन की अनुमति देता है। –

+0

नहीं, नहीं - आपके पास एक बहुत गतिशील भाषा हो सकती है (पाइथन कहें) जो बॉक्स के बाहर इसका समर्थन नहीं करती है ... आपको एक विशेष "मल्टीमीथ्स" एडन का उपयोग करना होगा। –

1

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

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

+0

उस सुविधा का अच्छा विवरण जो मैं खोज रहा हूं - मैं इसे अपने मुद्दे के संपादन में रखने के लिए इतना साहसी था। आप सही हैं - बहुरूपता शायद एक बुरी अवधि है, लेकिन कोई भी मेरे दिमाग में नहीं आया। – msi

1

Open Multi-Methods for C++, पीटर पिरकेल्बौयर, यूरी सोलोडकी और बजेर्न स्ट्राउस्ट्रप द्वारा।

यह पेपर गतिशील रूप से लोड किए गए पुस्तकालयों से निपटने और सही तरीके से प्रेषण के लिए वास्तविक लेआउट जैसे कुछ बहुत ही रोचक कार्यान्वयन विवरणों के साथ सी ++ में बहु-विधियों को एकीकृत करने के लिए एक भाषा विस्तार पर चर्चा करता है। ध्यान दें कि यह अभी तक सी ++ मानक का हिस्सा नहीं है, और शायद किसी भी बड़े कंपाइलर का हिस्सा नहीं है।

7

खैर Visitor pattern

+0

ऐसी भाषाओं के लिए जो एकाधिक प्रेषण और/या पैटर्न मिलान करने वाले विज़िटर पैटर्न का समर्थन नहीं करते हैं, शायद सबसे अच्छा समाधान है। – Evan

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