2011-03-25 13 views

उत्तर

74

एक प्रोटोकॉल, जिसे उद्देश्य-सी में @protocol वाक्यविन्यास के साथ घोषित किया गया है, का उपयोग उन तरीकों का एक सेट घोषित करने के लिए किया जाता है, जो एक वर्ग "गोद लेता है" (घोषित करता है कि यह इस प्रोटोकॉल का उपयोग करेगा) लागू होगा। इसका अर्थ यह है कि आप अपने कोड में निर्दिष्ट कर सकते हैं कि, "आप परवाह नहीं है कि जब तक यह एक विशेष प्रोटोकॉल लागू करता है तब तक कौन सी कक्षा का उपयोग किया जाता है"। यह ऑब्जेक्टिव-सी में किया जा सकता इस प्रकार है:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

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

प्रतिनिधि प्रोटोकॉल की भाषा सुविधा का एक प्रयोग कर रहे हैं। delegation design pattern आवश्यकतानुसार प्रोटोकॉल का उपयोग करने के लिए अपने कोड को डिज़ाइन करने का एक तरीका है। कोको ढांचे में, प्रतिनिधि डिजाइन पैटर्न का उपयोग कक्षा के एक उदाहरण को निर्दिष्ट करने के लिए किया जाता है जो किसी विशेष प्रोटोकॉल के अनुरूप होता है। यह विशेष प्रोटोकॉल उन विधियों को निर्दिष्ट करता है जो प्रतिनिधि वर्ग को दिए गए कार्यक्रमों पर विशिष्ट क्रियाएं करने के लिए लागू करना चाहिए। प्रतिनिधि जो प्रतिनिधि का उपयोग करता है जानता है कि उसके प्रतिनिधि कॉफ़ॉर्म प्रोटोकॉल पर हैं, इसलिए यह जानता है कि यह दिए गए समय पर लागू विधियों को कॉल कर सकता है। यह डिज़ाइन पैटर्न कक्षाओं को decoupling का एक शानदार तरीका है, क्योंकि यह एक प्रतिनिधि उदाहरण को दूसरे के लिए विनिमय करना वास्तव में आसान बनाता है - सभी प्रोग्रामर को यह सुनिश्चित करना है कि प्रतिस्थापन उदाहरण या कक्षा आवश्यक प्रोटोकॉल के अनुरूप हो (यानी यह लागू करता है प्रोटोकॉल में निर्दिष्ट विधियों)!

प्रोटोकॉल और प्रतिनिधि केवल उद्देश्य-सी और मैक/आईओएस विकास तक ही सीमित नहीं हैं, लेकिन उद्देश्य-सी भाषा और ऐप्पल ढांचे इस भयानक भाषा सुविधा और डिजाइन पैटर्न का भारी उपयोग करते हैं।

संपादित करें:

यहाँ एक उदाहरण है। कोको टच के UIKit ढांचे में, UITextFieldDelegate प्रोटोकॉल है। यह प्रोटोकॉल विधियों की एक श्रृंखला को परिभाषित करता है जो कक्षाएं के प्रतिनिधि हैं UITextField उदाहरण लागू करना चाहिए। दूसरे शब्दों में, यदि आप UITextField (delegate संपत्ति का उपयोग करके) को एक प्रतिनिधि को असाइन करना चाहते हैं, तो आप बेहतर ढंग से सुनिश्चित करेंगे कि यह वर्ग UITextFieldDelegate पर अनुरूप है। वास्तव में, क्योंकि UITextField के प्रतिनिधि संपत्ति के रूप में परिभाषित किया गया है:

@property(nonatomic, weak) id<UITextFieldDelegate> delegate

फिर संकलक चेतावनी यदि आप इसे करने के लिए एक वर्ग है कि प्रोटोकॉल को लागू नहीं करता है आवंटित दे देंगे। यह वास्तव में उपयोगी है। आपको यह बताना होगा कि एक वर्ग प्रोटोकॉल लागू करता है, और यह कहकर कि यह करता है, आप अन्य वर्गों को यह बताते हैं कि वे आपकी कक्षा के साथ किसी विशेष तरीके से बातचीत कर सकते हैं।इसलिए, यदि आप UITextField, UITextField है कि यह कुछ विशेष तरीकों कॉल कर सकते हैं जानता है की delegate संपत्ति को MyTextFieldDelegateClassका एक उदाहरण आवंटित अपने MyTextFieldDelegateClass की (पाठ में प्रवेश, चयन आदि से संबंधित)। यह इसलिए जानता है क्योंकि MyTextFieldDelegateClass ने कहा है कि यह UITextFieldDelegate प्रोटोकॉल को लागू करेगा।

आखिरकार, यह सब आपके प्रोजेक्ट के कोड में अधिक लचीलापन और अनुकूलता की ओर जाता है, जो मुझे यकीन है कि आपको जल्द ही इस तकनीक का उपयोग करने के बाद महसूस होगा! :)

+3

तो प्रोटोकॉल है कि आप क्या और प्रतिनिधियों तरीका है इसे करने के लिए? – 3lvis

+13

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

+0

@ जेम्ससडफोर्ड क्या आप मुझे बता सकते हैं कि "id " – Exploring

13

प्रतिनिधिमंडल: एक अन्य वस्तु की ओर से काम (डिजाइन उफ़ में पैटर्न)

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

एक उदाहरण एपोबजेक्ट की ओर से अपरिपक्व वस्तु कार्य करता है।

प्रोटोकॉल: वस्तुओं विरासत

एक प्रोटोकॉल द्वारा संबंधित नहीं के बीच संचार को सक्षम करने से एक कार्यक्रम इंटरफ़ेस जिसका तरीकों किसी भी वर्ग implement.Protocols उद्देश्य सी भाषा विशेषता है सकते हैं .Simply की एक सूची बोल की घोषणा है विधियां किसी भी वर्ग को कार्यान्वित कर सकती हैं। इसका उपयोग करने के लिए आपको प्रोटोकॉल की पुष्टि करने की आवश्यकता है। उदाहरण UITableviewDatasource प्रोटोकॉल है, जिसका तरीका प्रोटोकॉल में cellforRowAtIndexPath घोषित किया गया है, लेकिन हम इसे तालिकादृश्य बनाने के लिए कार्यान्वित करते हैं।

देखें https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

12

प्रोटोकॉल विधियों (या तो वैकल्पिक या आवश्यक) उन वर्ग जो कि प्रोटोकॉल के अनुरूप द्वारा कार्यान्वित किया जाएगा का एक सेट है। हालांकि, प्रतिनिधि उस वर्ग का संदर्भ है जो उस प्रोटोकॉल के अनुरूप है और प्रोटोकॉल में परिभाषित विधियों को लागू करने का पालन करेगा।

अधिक जानकारी के लिए this पर एक नज़र डालें।

+1

सबसे अच्छा स्पष्टीकरण मैंने कभी देखा है, धन्यवाद। –

+0

कृपया उस मामले में उत्तर को ऊपर उठाएं .. – NSPratik

+1

चिंता न करें, मैंने किया। –

4

कार्यक्रम में प्रतिनिधि की घोषणा देख

id<myProtocol> *delegatingObject; 

delegatingObject अन्य वस्तु के लिए और उचित समय पर संदर्भ रखता है उस वस्तु को संदेश भेजता करते हैं।

एक प्रोटोकॉल संबंधित गुणों और विधियों का एक समूह है जिसे किसी भी वर्ग द्वारा कार्यान्वित किया जा सकता है।

इसका तात्पर्य है कि मेरा ऑब्जेक्ट (आईडी प्रकार) जो मेरीप्रोकॉल (संबंधित गुणों और विधियों का समूह) की पुष्टि करता है, एक प्रतिनिधि के रूप में काम कर सकता है या आप किसी भी व्यक्ति (आईडी) को कह सकते हैं जिसके पास आवश्यक डिग्री (प्रोटोकॉल) एक काम कर सकती है शिक्षक (प्रतिनिधि)।

4

एक मैं mportant पी rerequisite प्रोटोकॉल समझने है च तो irst प्रतिनिधियों। मुझे सलाह है कि आप पहले this लघु ट्यूटोरियल देखें, फिर What is a Protocol? देखें। इसके अलावा आपको कक्षा और प्रोटोकॉल के बीच अंतर पता होना चाहिए ताकि Objective-C: Class versus Protocol और What is the point of Protocols? देखें।


protocol: ही लागू करने के लिए कार्यों की एक खाका है। उस ब्लूप्रिंट को गोद लेने वाले किसी भी वर्ग को उन कार्यों को लागू करना होगा। ( एक समारोह को लागू करने गलती न करें कि बुला एक समारोह के साथ)

delegate: है आप भी बिनाविरासत क्या एक delegat- ing वर्ग कर रही है करने के लिए जैसे

उदाहरण के लिए आपके पास एक व्यू कंट्रोलर है और आप छवियों को डाउनलोड करना चाहते हैं या आप किसी स्टोर में ग्राहक की दूरी प्राप्त करना चाहते हैं, इसलिए इसे अपने आप करने के बजाय, आपके पास केवल एक मध्यम वस्तु है जो आपके लिए यह करती है। उस वस्तु को प्रतिनिधि वस्तु के रूप में जाना जाता है। आम तौर पर आप जैसे कुछ करना होगा:

class ViewController : UIViewController , DownloaderDelegate{ 
//other code 

(inside viewDidLoad or elsewhere) you write: 
downloaderHandler.delegate = self // now self can also do WHATEVER the delegate can do...previously it was only a viewController but now it's 'almost' also a downloader 

बहुत आप एक tableViewDelegate

class ViewController : UIViewController , UITableViewDelegate{ 
//other code 
(inside viewDidLoad or elsewhere) you write 
tableView.delegate = self 

अपने self अब भी कर सकते हैं tableView संबंधित सामान के अनुरूप के लिए क्या कर के समान है।


delegate: लेकिन उस वस्तु (प्रतिनिधि) एक सादे वेनिला वस्तु (आईडी या किसी भी) है। यह गूंगा है! आपको यह बताने पड़ते हैं: "हे आपके लिए परिभाषित प्रोटोकॉल के अनुरूप आपको आवश्यक विशिष्ट कार्यक्षमताओं के लिए काम करने के लिए हे। (हम किसी भी या आईडी को विस्तारित नहीं करेंगे क्योंकि यह बेवकूफ होगा, (इसके बजाए) हमने बनाया एक बहुत ही स्पष्ट सीमित प्रोटोकॉल "
ऑब्जेक्टिव-सी में यह एक शुद्ध वेनिला id है, तो आप कर

@property (weak) id<DownloaderProtocol>delegate; 

स्विफ्ट * में यह थोड़ा आसान आप कैसे करते है:

weak var delegate:DownloaderProtocol? 

प्रोटोकॉल की बात आती है बचाव ... डी समारोह के लिए विरासत उपकरण (उपयोग नहीं) हालांकि यह आपके प्रतिनिधि वर्ग की जरूरतों के अनुरूप है।


*: स्विफ्ट में आप id नहीं है अभी भी आप इसे बराबर Any है क्योंकि स्विफ्ट प्रोटोकॉल में भी एक बेहतरीन सुविधा प्रकार के होते हैं की जरूरत नहीं है

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