यदि आप प्रोटोकॉल का उपयोग करते हैं, तो आपको दो वर्ग प्रकारों द्वारा साझा की गई विधियों को दो बार परिभाषित करना होगा। प्रोटोकॉल आम तौर पर सुरक्षा पैटर्न जोड़ने के लिए प्रतिनिधिमंडल पैटर्न जैसे विशिष्ट पैटर्न के लिए आरक्षित होते हैं और गलती करने के लिए आपके लिए कठिन बनाते हैं, या जब कक्षा पदानुक्रम में पहले से ही एम्बेडेड कई कक्षाओं को सामान्य तरीकों को साझा करने की आवश्यकता होती है और इस साझाकरण को दस्तावेज किया जाना चाहिए कुछ रास्ता यदि एक वर्ग को दूसरे के एक विशेष संस्करण के रूप में दर्शाया जा सकता है, तो आपको विरासत मिलनी चाहिए।
उदाहरण के लिए, मान लें कि आपके पास आपके गेम में Vehicle
कक्षा है जो जानता है कि सभी तरह की चीजें कैसे करें, जैसे कि घूमना। यदि आप Car
कक्षा बनाना चाहते हैं, तो आप शायद Vehicle
कक्षा को उपclass कर सकते हैं ताकि आप इसके सभी विधि कार्यान्वयन का वारिस कर सकें; या तो उन्हें थोक का उपयोग करने या विधियों के अपने संस्करण को लागू करने के लिए, शायद सुपरक्लास के कार्यान्वयन को कॉल करने से पहले उप-वर्ग के लिए विशिष्ट कुछ कार्य निष्पादित करना। उप-वर्गीकरण तब होता है जब आप किसी भी तरीके से इसे संशोधित करते समय अपने सुपरक्लास के गुणों और व्यवहारों का उत्तराधिकारी बनना चाहते हैं। यह विशेष रूप से सच है जब कक्षा में अतिरिक्त डेटा जोड़ा जाना चाहिए, जैसे आवृत्ति चर, क्योंकि आप श्रेणियों के साथ ऐसा नहीं कर सकते हैं (हालांकि आप Class Extension
के साथ कर सकते हैं, जिसे अक्सर एक निजी इंटरफ़ेस के रूप में देखा जाता है)। आम तौर पर, उप-वर्गों के परिणामस्वरूप उनके सुपरक्लास के मुकाबले अधिक विशेष उद्देश्य होते हैं।
प्रोटोकॉल बस, प्रोटोकॉल हैं। वे आपको कुछ खराब करने या भूलने से रोकने के लिए वहां हैं, और सुनिश्चित करें कि प्रत्येक ऑब्जेक्ट जो करता है, वह करता है, जब कक्षाएं व्यवहार नहीं कर रही हैं, तो संकलक चेतावनियां ट्रिगर करते हैं। प्रतिनिधिमंडल जैसे पैटर्न के लिए यह महत्वपूर्ण है, क्योंकि यह सुनिश्चित करने का एकमात्र तरीका है कि प्रतिनिधि आपके द्वारा दिए गए तरीकों को लागू करता है और यह जानने के लिए कि आपके प्रतिनिधि का किस प्रकार का ऑब्जेक्ट है। उदाहरण के लिए, मेरी परियोजनाओं में से एक से नीचे दिए गए कोड को देखें।
//SGSprite.h
@protocol SGSpriteDelegate
- (BOOL) animation:(int)animationIndex willCompleteFrameNumber:(int)frame forSprite:(id)sender;
@end
@interface SGSprite : NSObject
@property (nonatomic, assign) id<SGSpriteDelegate> delegate;
@end
//SGViewController.h
@interface SGViewController : UIViewController <SGSpriteDelegate>
//...dreadfully boring stuff
@end
कई कक्षाओं बनावट 2 डी quads प्रतिपादन के लिए मेरी SGSprite
वर्ग का उपयोग करें। कभी-कभी, उन्हें पता होना चाहिए कि एक स्प्राइट एनीमेशन के एक निश्चित फ्रेम तक पहुंचता है, इसलिए SGSprite
उदाहरणों को अपने प्रतिनिधियों पर एक विधि को कॉल करने की आवश्यकता होती है ताकि उन्हें कुछ फ्रेम मिल जाए। यह सुनिश्चित करने का एकमात्र तरीका है कि इस वर्ग के उदाहरणों के प्रतिनिधियों ने इस विधि को लागू किया है, और, वास्तव में, मुझे चेतावनी दीजिए कि अगर कोई ऐसा ऑब्जेक्ट असाइन करने का प्रयास करता है जो प्रतिनिधि के रूप में नहीं है, तो प्रोटोकॉल के उपयोग के माध्यम से होता है। आप देखेंगे कि अगर मैं प्रतिनिधि को एक सादा id
करता हूं तो जब भी मैं अपने प्रतिनिधि पर इस विधि को कॉल करता हूं तो मुझे चेतावनी मिल जाएगी, क्योंकि इसका कार्यान्वयन नहीं मिल सकता है, जबकि अगर मैं प्रतिनिधि का हेडर आयात करता/स्थिर रूप से प्रतिनिधि टाइप करता हूं, तो कक्षा अब अच्छी तरह से encapsulated नहीं है।
आपको ज्यादातर मामलों में तकनीकी रूप से प्रोटोकॉल की आवश्यकता नहीं है; आप उन सभी वर्गों में प्रोटोकॉल के बिना सभी विधियों को परिभाषित कर सकते हैं जो आम तौर पर कहा प्रोटोकॉल का पालन करेंगे, और सब कुछ ठीक काम करेगा। हालांकि, इन सामान्य तरीकों को अब दस्तावेज नहीं किया गया है। इस प्रकार, कुछ वर्गों या अज्ञात वस्तुओं को लागू करने की सुरक्षा से परे विधियों को लागू करने के लिए आपको उन्हें लागू करने की आवश्यकता होती है, आप यह भी बता सकते हैं कि क्या और कैसे करता है। प्रोटोकॉल तब होते हैं जब आपको यह सुनिश्चित करने की आवश्यकता होती है कि कक्षा, या कक्षा का उदाहरण, कुछ विधि लागू करता है, खासकर जब किसी ऑब्जेक्ट के प्रकार को कक्षा को समाहित रखने के लिए नहीं जाना चाहिए।
प्रथम श्रेणी क्या है और दूसरी कक्षा क्या है? उनके पास कितना आम है? यह सवाल बेहतर होगा अगर उसने एक या अधिक विशिष्ट परिदृश्यों के बारे में पूछा। बंद करने के लिए वोट नहीं दे रहा है, लेकिन यह इंगित करता है कि प्रश्न आसानी से उत्तर देने के लिए थोड़ा बहुत व्यापक है। – paulmelnikow