2010-01-05 11 views
50

मैं सोच रहा था कि कोई व्यक्ति बता सकता है कि उद्देश्य सी में अनौपचारिक प्रोटोकॉल क्या है? मैं इसे सेब प्रलेखन और कुछ अन्य पुस्तकों पर समझने की कोशिश करता हूं लेकिन मेरा सिर अभी भी कताई कर रहा है, इसलिए मैं वास्तव में सराहना करता हूं कि अगर कोई उदाहरण के साथ समझा सकता है।अनौपचारिक प्रोटोकॉल उद्देश्य-सी में?

धन्यवाद।

उत्तर

58

एक अनौपचारिक प्रोटोकॉल, एक वर्ग नहीं इसी कार्यान्वयन के साथ NSObject पर घोषित था के रूप में Jonnathan ने कहा, आम तौर पर (सबसे अधिक बार - वहाँ दुर्लभ एक है कि NSObject पर डमी कार्यान्वयन प्रदान किया था)।

10.6 (और आईफोन एसडीके में) के रूप में, इस पैटर्न का अब उपयोग नहीं किया जाता है। विशेष रूप से, 10.5 (और पूर्व) में इस प्रकार है क्या घोषित किया गया था:

@interface NSObject(NSApplicationNotifications) 
- (void)applicationWillFinishLaunching:(NSNotification *)notification; 
... 
@interface NSObject(NSApplicationDelegate) 
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; 
... 

अब घोषित किया जाता है के रूप में:

@protocol NSApplicationDelegate <NSObject> 
@optional 
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; 
... 
- (void)applicationWillFinishLaunching:(NSNotification *)notification; 
... 

है, अनौपचारिक प्रोटोकॉल अब के रूप में @protocol रों @optional तरीकों में से एक समूह के साथ घोषणा की जाती है ।

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

4

सभी अनौपचारिक प्रोटोकॉल कुछ वर्ग (अक्सर NSObject) पर एक श्रेणी है जो प्रोटोकॉल के लिए इंटरफेस बताता है। ऐपकिट अपने प्रतिनिधिमंडल के लिए बहुत कुछ उपयोग करता है।

आपके द्वारा लिखे गए एक उप-वर्ग में इन विधियों को लागू किया जा सकता है। इस और औपचारिक प्रोटोकॉल के बीच का अंतर यह है कि @protocol ... @end नोटेशन का उपयोग करके औपचारिक प्रोटोकॉल घोषित किए जाते हैं। कोई जांच नहीं है कि कक्षा लागू एक अनौपचारिक प्रोटोकॉल लागू करता है या नहीं।

मैं लगभग हमेशा औपचारिक प्रोटोकॉल का उपयोग, लेकिन मुझे लगता है कि एक अनौपचारिक प्रोटोकॉल उपयोगी है जब आप (सिर्फ अपने वर्ग के लिए एक कार्यान्वयन कि अधिरोहित जा सकता है प्रदान करते हैं) डिफ़ॉल्ट व्यवहार प्रदान करना चाहते हैं।

+0

तो अपने 'उपवर्गीकरण "बात के बारे में और उसके बाद उन्हें लागू? मैं <प्रोटोकॉल/श्रेणी> वाक्यविन्यास का प्रयास कर रहा था। – itsaboutcode

9

अनौपचारिक प्रोटोकॉल के सामान्य उदाहरणों में से एक कॉलबैक को परिभाषित करना है। मान लीजिए कि आप एक लाइब्रेरी का उपयोग कर रहे हैं जो आपको पृष्ठभूमि में कुछ डाउनलोड करने देता है। यह लाइब्रेरी आपको कॉलबैक ऑब्जेक्ट को पूर्ण होने पर कॉल करने देती है।

- (void)download:(NSURL*)url whenComplete:(id)callback 

डाउनलोड पूर्ण हो जाए, तो यह आपके कॉलबैक वस्तु पर एक विशेष विधि कॉल करेगा:

- (void)downloadComplete:(NSURL*)url 
बेशक

, वहाँ कोई गारंटी नहीं है कि अपने कॉलबैक वस्तु वास्तव में इस पद्धति को लागू करता है। अनौपचारिक प्रोटोकॉल एक श्रेणी का उपयोग करते हुए NSObject पर इन विधियों के मामूली कार्यान्वयन प्रदान करते हैं। नतीजतन, सिस्टम में सभी ऑब्जेक्ट्स downloadComplete: विधि का जवाब देंगे, हालांकि वे डिफ़ॉल्ट रूप से उस विधि के जवाब में कुछ भी नहीं करेंगे। downloadComplete: विधि को ओवरराइड करने वाली कक्षाएं अधिक उपयोगी कार्यक्षमता प्रदान कर सकती हैं।

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

उद्देश्य-सी 2.0 के बाद, औपचारिक प्रोटोकॉल में वैकल्पिक विधियां हो सकती हैं। इसके अलावा, ऐप्पल नए एपीआई के लिए अनौपचारिक प्रोटोकॉल से दूर जा रहा है - UIAccelerometerDelegate एक औपचारिक प्रोटोकॉल है।

+0

'कॉलबैक' शब्द का उपयोग यहां संभावित रूप से भ्रमित है, खासकर ऐसी दुनिया में जहां ब्लॉक मौजूद हैं। आप प्रतिनिधिमंडल के बारे में क्या बात कर रहे हैं। (मुझे एहसास है कि यह उत्तर शायद 2010 में अधिक समझ में आया।) –

3

पर "जोनाथन स्टर्लिंग" जवाब के आधार पर, मैं कह सकता हूँ निम्नलिखित कोड अनौपचारिक प्रोटोकॉल का प्रतिनिधित्व करते हैं?

एप्पल प्रलेखन:

"जब एक प्रोटोकॉल घोषित करने के लिए प्रयोग किया जाता है, एक वर्ग इंटरफ़ेस एक इसी कार्यान्वयन कक्षाएं कि प्रोटोकॉल लागू उनके अपने इंटरफेस फाइलों में फिर से तरीकों की घोषणा नहीं है इसके बजाय, और उन्हें साथ परिभाषित करते हैं। उनकी कार्यान्वयन फाइलों में अन्य तरीकों के साथ। "

#import <Foundation/Foundation.h> 

@interface Cat1 : NSObject { 


} 
- (void) simpleMethod; 

@end 

@implementation Cat1 

- (void) simpleMethod 
{ 

    NSLog(@"Simple Method"); 
} 

@end 


@interface Cat1 (Cat2) 
- (void) addingMoreMethods; 

@end 




@interface MYClass : Cat1 

@end 

@implementation MYClass 

- (void) addingMoreMethods 
{ 
    NSLog(@"Testing!"); 
} 
@end 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 


    MYClass *myclass = [[MYClass alloc] init]; 
    [myclass addingMoreMethods]; 
    [myclass release]; 
    [pool drain]; 
    return 0; 
} 
+0

सॉर्टा। * Cat2 * में घोषित विधि एक अनौपचारिक प्रोटोकॉल है, कम या ज्यादा। हालांकि, उपयोग नहीं है - आम तौर पर, आप देखेंगे कि अगर ([myclass प्रतिसाद देता है तो चयनकर्ता: @ चयनकर्ता (जोड़ना अधिक मोड)] [myclass addoreMoreMethods]; '। – bbum

+0

धन्यवाद bbum, मुझे दिलचस्पी नहीं है अगर यह बहुत अधिक उपयोग किया जाता है, लेकिन मैं वास्तव में पूरी अवधारणा को समझना चाहता था! – itsaboutcode

+3

बिंदु, हालांकि, यह है कि एक अनौपचारिक प्रोटोकॉल उन तरीकों से बना है जो वैकल्पिक रूप से कार्यान्वित किए जा सकते हैं। इस प्रकार, कॉलिंग साइट * को यह देखना चाहिए कि यह लागू किया गया है या नहीं तो कॉल क्रैश हो जाएगा! – bbum

1

एक अनौपचारिक प्रोटोकॉल परिभाषित करता है कि किसी ऑब्जेक्ट को कौन सी विधियों को समझना चाहिए। इसे "प्रोटोकॉल के अनुरूप" कहा जाता है। एक प्रोटोकॉल के अनुरूप कक्षा पदानुक्रम से स्वतंत्र है। किसी ऑब्जेक्ट के संदर्भ को रखने के लिए पॉइंटर घोषित करते समय आप परिभाषित कर सकते हैं कि इस ऑब्जेक्ट को किस प्रोटोकॉल को अनुरूप बनाना चाहिए। यदि आप कोड लिखते हैं जो किसी ऑब्जेक्ट को असाइन करता है जो सभी आवश्यक प्रोटोकॉल के अनुरूप नहीं है, तो आपको संकलन समय पर एक चेतावनी मिलेगी। अनौपचारिक प्रोटोकॉल आपको उन तरीकों के सेट पर भरोसा करने में मदद करते हैं, जो किसी ऑब्जेक्ट को समझते हैं। आपको isKindOfClass का आह्वान करने की आवश्यकता नहीं है: या जवाब देता है: आपके कोड में पारित गीली वस्तुओं की जांच करने के लिए आपके प्रसंस्करण के लिए उपयुक्त होगा। प्रोटोकॉल पहलू उन्मुख प्रोग्रामिंग के प्रकार हैं।

5

हम एक वर्ग घोषणा में तरीकों समूहीकरण एक informal protocol परिभाषित करते हैं,

@interface NSObject (MyXMLSupport) 
- initFromXMLRepresentation:(NSXMLElement *)XMLElement; 
- (NSXMLElement *)XMLRepresentation; 
@end 

Informal protocol रों आम तौर पर, NSObject वर्ग की श्रेणियों के रूप में घोषित किया गया है के बाद से है कि मोटे तौर पर किसी भी वर्ग है कि से विरासत के साथ विधि के नाम संबद्ध करता है NSObject

क्योंकि सभी वर्ग रूट वर्ग से प्राप्त होते हैं, विधियां विरासत पदानुक्रम के किसी भी हिस्से तक सीमित नहीं हैं। ( को informal protocol को किसी अन्य वर्ग की श्रेणी के रूप में घोषित करना संभव होगा, ताकि इसे विरासत पदानुक्रम, की एक निश्चित शाखा तक सीमित कर दिया जा सके लेकिन ऐसा करने का कोई कारण नहीं है)।

जब प्रोटोकॉल घोषित करने के लिए उपयोग किया जाता है, तो एक श्रेणी इंटरफ़ेस में कोई कार्यान्वयन नहीं होता है। इसके बजाए, प्रोटोकॉल को लागू करने वाले कक्षाएं अपनी इंटरफ़ेस फ़ाइलों में विधियों को दोबारा घोषित करती हैं और उन्हें को उनके कार्यान्वयन फ़ाइलों में अन्य विधियों के साथ परिभाषित करती हैं।

5

अनौपचारिक प्रोटोकॉल एक तरीका श्रेणी के माध्यम से एक वस्तु के लिए वैकल्पिक तरीकों को जोड़ने के लिए हैं।

तो एक संदेह उठता

यह अनौपचारिक प्रोटोकॉल हो जाएगा अगर वहाँ प्रोटोकॉल पर ही किसी भी वैकल्पिक तरीके हैं हो सकता है?

उत्तर नहीं है।

तरीकों प्रोटोकॉल घोषित किये गए हैं और यह वर्ग के किसी भी उपयोग के बिना एक वर्ग के अनुरूप होने के लिए कहा जाता है तो यह औपचारिक प्रोटोकॉल है।

नोट: प्रोटोकॉल में

वैकल्पिक तरीकों उद्देश्य सी 2.0 में तो इससे पहले कि उस उद्देश्य श्रेणी के माध्यम से अनौपचारिक प्रोटोकॉल यानी के माध्यम से हासिल किया गया था शुरू किए गए थे।

श्रेणी:

यह उर्फ ​​विरासत classing उप के लिए विकल्प होना एक भाषा के स्तर की सुविधा है।

मुझे आशा है कि यह इस पर कुछ चूने प्रकाश डालता है ..

+1

उस के लिए धन्यवाद "नोट:" 'मुझे पूरी तस्वीर दी :-) – byJeevan

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