2010-12-07 10 views
9

सरल उत्तर प्रोटोकॉल होगा।उद्देश्य-सी में सी ++ शुद्ध-वर्चुअल फ़ंक्शन के बराबर क्या है?

एक और बिंदु यह है कि ऐसा कहा जाता है कि ऑब्जेक्टसी में सभी विधियां आभासी हैं, इसलिए ओबीजेसी में आभासी कहने की कोई आवश्यकता नहीं है।

मुझे इस अवधारणा को समझना मुश्किल लगता है।

इस प्रश्न के आसपास और अधिक स्पष्ट करने के लिए कोई टिप्पणी?

टिप्पणी के लिए धन्यवाद।

+0

http://stackoverflow.com/questions/5222083/implement-a-pure-virtual-method-in-objective-c –

उत्तर

13

सरल जवाब प्रोटोकॉल होगा।

सरल लेकिन गलत। एक प्रोटोकॉल एक इंटरफेस विनिर्देश है। यह संदेशों का एक संग्रह है कि किसी ऑब्जेक्ट को (@optional कीवर्ड को अभी अनदेखा करना) का जवाब देना चाहिए।

शब्द "वर्चुअल फ़ंक्शन" का उद्देश्य उद्देश्य-सी में कोई प्रत्यक्ष समकक्ष नहीं है। उद्देश्य-सी में आप वस्तुओं पर फ़ंक्शंस नहीं कहते हैं, आप उन्हें संदेश भेजते हैं। ऑब्जेक्ट स्वयं तब निर्णय लेता है कि संदेश का जवाब कैसे दिया जाए, आम तौर पर इसके वर्ग ऑब्जेक्ट में संदेश देखकर, संबंधित विधि ढूंढकर और इसका आह्वान करना। ध्यान दें कि यह सब रन टाइम पर होता है, समय संकलित नहीं करता है।

संदेशों के बीच मैपिंग (या "चयनकर्ता" उन्हें तकनीकी शब्द देने के लिए) और विधियों को पूरी तरह से @implementation से बनाया गया है। @interface में विधि घोषणाएं केवल कंपाइलर को वह जानकारी देने के लिए हैं जो आपको चेतावनी देने के लिए आवश्यक है कि आप एक विधि कार्यान्वयन भूल गए हैं। और यह केवल एक चेतावनी है क्योंकि आप रन टाइम तक नहीं बता सकते हैं कि क्या ऑब्जेक्ट वास्तव में संदेश का जवाब देता है या नहीं। उदाहरण के लिए, कोई और मौजूदा वर्ग में एक श्रेणी जोड़ सकता है जो अनुपलब्ध विधियों के लिए कार्यान्वयन प्रदान करता है, या एक वर्ग forwardingTargetForSelector: को उन संदेशों को अग्रेषित करने के लिए ओवरराइड कर सकता है जो इसे कहीं और प्रतिक्रिया नहीं देते हैं।

+0

+1 पर्याप्त बंद करें। यद्यपि आप उस ऑब्जेक्ट को संदेश भेजने के रूप में C++ ऑब्जेक्ट्स पर विधियों को देख सकते हैं, लेकिन यह केवल संदेश का बाध्यकारी रनटाइम के बजाए संकलन समय पर किया जाता है। –

+1

@ मार्टिन यॉर्क: वोट के लिए धन्यवाद। हां, आप एक संदेश भेजने के रूप में एक C++ ऑब्जेक्ट पर फ़ंक्शन को कॉल करने पर देख सकते हैं, लेकिन यह वास्तव में सच नहीं है और ऐसा करने में मददगार नहीं है, जबकि यह उद्देश्य-सी में सत्य है और ऐसा करने में मददगार है। – JeremyP

+1

मुझे लगता है कि ओओ के उत्प्रेरक आपके साथ असहमत होंगे। यह वास्तव में एक विधि की अवधारणा है (वस्तु को एक संदेश)। सी ++ और ओब्जे-सी के बीच महत्वपूर्ण अंतर केवल वास्तविक विधि के लिए कॉल का बाध्यकारी है। संकलन समय पर सी ++ किया जाता है ओब्जे-सी रनटाइम पर किया जाता है (यह एकमात्र अंतर है)। एक अच्छा सारांश ओओ-पी के बारे में एक अवशिष्ट संदर्भ यहां पाया जा सकता है। http://en.wikipedia.org/wiki/Object-oriented_programming –

2

उद्देश्य-सी में ऑब्जेक्ट्स पर विधियां वर्चुअल फ़ंक्शन नहीं हैं, वे वास्तविक कार्य हैं।

मैं अलग होना चाहता हूं, ओब्जे-सी में विधियां बिल्कुल वास्तविक नहीं हैं जैसे किसी की उम्मीद होगी। वे सी ++ में वर्चुअल फ़ंक्शंस की तरह व्यवहार करते हैं, सिवाय इसके कि आप उद्देश्य-सी में 'शुद्ध आभासी' फ़ंक्शन नहीं बना सकते हैं।

चीयर्स, Raxit

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