संदेश पास करना किसी वस्तु को किसी अन्य वस्तु (या संभवतः स्वयं) को प्राप्त करने के लिए OO कोड में आवश्यकता को संभालने का एक अलग तरीका है।
अधिकांश आधुनिक भाषाओं में जो C ++ दृष्टिकोण से उतरते हैं, हम विधि कॉल के साथ करते हैं। इस स्थिति में, ऑब्जेक्ट (इसकी कक्षा परिभाषा के माध्यम से) इस बात की एक बड़ी सूची रखता है कि कौन सी विधि इसे स्वीकार करती है और फिर कॉलिंग ऑब्जेक्ट का कोडर केवल कॉल लिखता है:
public void doSomething ( String input )
...
other_object.dosomething ( local )
इसके बाद सांख्यिकीय रूप से टाइप की गई भाषाओं के लिए संकलक फिर बुलाए जा रहे प्रकार की जाँच कर सकता है और पुष्टि कर सकता है कि विधि घोषित कर दी गई है। गतिशील रूप से टाइप की गई भाषाओं के लिए फिर रनटाइम पर किया जाता है।
लेकिन संक्षेप में यह होता है कि कोड के एक विशिष्ट ब्लॉक में चर का एक बंडल भेजा जाता है।
संदेश देना
मैसेज पासिंग लैंग्वेजेज (जैसे ऑब्जेक्टिव सी) में तरीकों के बजाय रिकवर होते हैं, लेकिन मोटे तौर पर उन्हें परिभाषित करने और उन्हें कॉल करने का तरीका एक जैसा ही होता है - अंतर यह है कि जिस तरह से इसे हैंडल किया जाता है।
एक संदेश में भाषा में संकलक जाँच कर सकता है कि आपके द्वारा कॉल किया गया रिसीवर मौजूद है, लेकिन सबसे बुरी तरह से यह कहने के लिए एक चेतावनी पॉप जाएगा कि यह सुनिश्चित नहीं है कि वहाँ है। ऐसा इसलिए है क्योंकि रन टाइम पर क्या होगा कि प्राप्त वस्तु पर कोड का एक ब्लॉक दोनों चर के बंडल और उस रिसीवर के हस्ताक्षर को पारित करना होगा जिसे आप कॉल करना चाहते हैं। कोड का वह ब्लॉक फिर रिसीवर को ढूंढता है और उसे कॉल करता है। हालाँकि यदि रिसीवर मौजूद नहीं है तो कोड केवल एक डिफ़ॉल्ट मान लौटाएगा।
परिणामस्वरूप C ++ / Java से चलते समय पाई जाने वाली विषमताओं में से एक -> Objective C यह समझ रही है कि आप उस वस्तु पर "विधि को कॉल कर सकते हैं" जिसे संकलन-समय प्रकार पर घोषित नहीं किया गया था, और उस पर मौजूद भी नहीं था रन-टाइम प्रकार ... और यह कि कॉल अपवाद के रूप में नहीं फेंका जाएगा, लेकिन वास्तव में एक परिणाम वापस पारित किया जा रहा है।
इस दृष्टिकोण के लाभ यह है कि यह उपवर्ग पदानुक्रम को समतल करता है और इंटरफेस / मल्टीपल इनहेरिटेंस / डक प्रकारों की अधिकांश आवश्यकताओं से बचा जाता है। यह ऑब्जेक्ट्स को डिफ़ॉल्ट व्यवहार को परिभाषित करने की अनुमति भी देता है जब उनसे कुछ ऐसा करने के लिए कहा जाता है जिसके लिए उनके पास कोई रिसीवर नहीं होता है (आमतौर पर "अगर मैं ऐसा नहीं करता हूं, तो इस अन्य ऑब्जेक्ट के लिए अनुरोध को अग्रेषित करें")। यह कॉलबैक (जैसे UI तत्वों और समयबद्ध घटनाओं के लिए कॉलिंग) को जोड़ने को भी सरल कर सकता है, विशेष रूप से जावा जैसे सांख्यिकीय रूप से टाइप की गई भाषाओं पर (इसलिए आप इनर क्लास पर "एक्शनपिरफॉर्म" विधि को कॉल करने के बजाय रिसीवर को "रनटेस्ट" कह सकते हैं) "RunTestButtonListener" जो आपके लिए कॉल करता है)।
हालाँकि ऐसा लगता है कि डेवलपर द्वारा अतिरिक्त जाँच की आवश्यकता की कीमत पर उन्हें लगता है कि वे जो कॉल कर रहे हैं वे सही प्रकार के साथ सही ऑब्जेक्ट पर हैं और सही क्रम में सही पैरामीटर पास कर रहे हैं, क्योंकि कंपाइलर नहीं हो सकता है आपको चेतावनी देता है और यह रनटाइम पर पूरी तरह से चलेगा (बस एक डिफ़ॉल्ट प्रतिक्रिया लौटाएगा)। यकीनन अतिरिक्त लुक-अप और पैरामटर पासिंग से एक प्रदर्शन हिट है।
इन दिनों, डायनामिक रूप से टाइप की गई भाषाएं कम मुद्दों के साथ ओओए संदेश के कई लाभ दे सकती हैं।