2011-06-18 11 views
5

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

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

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

मैं वास्तव में इनमें से किसी के प्रयोजन नहीं दिख रहा है, मुझे आशा है कि कोई मुझे उनके वास्तविक उपयोग बता सकते हैं =/

अग्रिम धन्यवाद, ईसाई

उत्तर

15

श्रेणियाँ उन वर्गों के तरीकों को जोड़ना है जिनके स्रोत आपके लिए अनुपलब्ध हैं, जैसे कि सभी ऐप्पल कक्षाएं (एनएस, सीजी, सीए, आदि से शुरू होने वाले), उन्हें उप-वर्ग की आवश्यकता के बिना।

प्रोटोकॉल का उद्देश्य उन प्रोटोकॉल का पालन करने वाले वर्गों को परिभाषित करना है। जावा में, उन्हें इंटरफेस कहा जाता है। इसका उद्देश्य उन वर्गों के बीच समानता को संहिताबद्ध करना है जो भाई बहन नहीं हैं (उसी सुपरक्लास के उप-वर्ग)। मान लें कि आपके पास कक्षा Chair और कक्षा Petrol है। इनके पास बहुत आम बात नहीं है, सिवाय इसके कि वे दोनों flammable प्रोटोकॉल का पालन करते हैं, जिसके लिए उन्हें specificEnergy और flamingPoint जैसे कुछ विधियों की आवश्यकता होती है।

अब आपके Fire कक्षा में एक विधि addFlammableMaterial:(id <flammable>)material हो सकती है।

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

+1

चीयर्स, जिसने वास्तव में बहुत मदद की :) – JheeBz

4

एक श्रेणी का एक तरीका है कक्षा को संशोधित किए बिना मौजूदा वर्ग के सभी उदाहरणों के लिए नई विधियां जोड़ना।

श्रेणी के लिए पहले से ही चर्चा अतः पद,

What is the difference between inheritance and Categories in Objective-C

पढ़ protocol-versus-category

प्रोटोकॉल अक्सर इस्तेमाल किया जाता है प्रतिनिधि वस्तुओं के लिए इंटरफेस निर्दिष्ट करने के लिए।

प्रोटोकॉल किसी भी वर्ग द्वारा लागू किए जा सकने वाले तरीकों की घोषणा करते हैं। प्रोटोकॉल कम से कम तीन स्थितियों में उपयोगी हैं:

To declare methods that others are expected to implement 
To declare the interface to an object while concealing its class 
To capture similarities among classes that are not hierarchically related 

read more uses of protocols.

+0

मेरा मूल प्रश्न "प्रोटोकॉल और श्रेणियां क्या हैं" नहीं था, यह था "आप प्रोटोकॉल और श्रेणियों का उपयोग क्यों करेंगे?" मैं समझता हूं कि प्रोटोकॉल और श्रेणियां क्या हैं, मुझे नहीं पता था कि आप कभी उनका उपयोग कब करेंगे, या क्यों। – JheeBz

+0

@ झीबज़: मैंने केवल यही पूछा जो आपने पूछा था। ** सेब लिंक के साथ प्रोटोकॉल ** का उपयोग ** और आपको उप-वर्ग के रूप में आपके पद में वर्णित विरासत और श्रेणी की अवधारणा को अलग करने के लिए एसओ पोस्ट लिंक भी प्रदान करता है। – Jhaliya

1

श्रेणियाँ ऐसे सभी एन एस ... वर्ग के रूप में मौजूदा कक्षाएं, में कार्यक्षमता जोड़ने के लिए इस्तेमाल किया जा सकता है। आप इन्हें सीधे कोड नहीं जोड़ सकते हैं।

प्रोटोकॉल का उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि एक निश्चित वर्ग वास्तव में कुछ करता है, जब आप प्रोटोकॉल में कोई विधि कॉल करते हैं।

2

प्रोटोकॉल जावा में इंटरफेस की तरह काम करते हैं। आप प्रोटोकॉल को कुछ तरीकों से परिभाषित कर सकते हैं और फिर इसे कई कक्षाओं में कार्यान्वित कर सकते हैं। इनमें से प्रत्येक कक्षा में प्रोटोकॉल द्वारा प्रदान की गई विधियों के विभिन्न कार्यान्वयन हो सकते हैं, लेकिन इंटरफ़ेस वही होगा। उदाहरण के लिए: आप विभिन्न प्रकार के कर्मचारियों के वेतन की गणना करना चाहते हैं, उदा। FullTimeEmployee और ContractEmployee। आप calculateSalary प्रोटोकॉल में विधि परिभाषा डाल सकते हैं और इन दो वर्गों में पूर्व कार्यान्वयन प्रदान कर सकते हैं, उदा। कोई निश्चित वेतन वापस करेगा जबकि दूसरा काम के घंटों के आधार पर वेतन वापस करेगा। फिर आप प्रत्येक क्लास इंस्टेंस को प्रोटोकॉल प्रकार में डाल सकते हैं और उपयुक्त परिणाम प्राप्त करने के लिए दी गई विधि को आमंत्रित कर सकते हैं।

श्रेणियाँ सहायक हैं यदि आप एक वर्ग का विस्तार करना चाहते हैं जो आपके अंतर्गत नहीं है, जैसे अंतर्निर्मित कक्षाओं के मामले में, पूर्व। NSString। आप उलटा स्ट्रिंग प्राप्त करने के लिए reverse जैसी विधि जोड़ सकते हैं। सबक्लास क्यों नहीं बनाना है? क्योंकि आप अपने प्रकार के संदर्भ कास्टिंग किए बिना संशोधित कक्षा पर अपनी कस्टम विधि को कॉल कर सकते हैं।

2

प्रोटोकॉल एक कक्षा में कोड अनुबंध लागू करने का एक तरीका है, वैसे ही इंटरफेस जावा और सी # में काम करता है।

श्रेणियां उन कक्षाओं को विस्तारित करने के लिए उपयोगी हैं जिन्हें आप सीधे संशोधित नहीं कर सकते हैं, वे सी # में एक्सटेंशन विधियों के समान हैं।

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