2012-02-22 5 views
7

वस्तु उदाहरणों के लिए हम अपनी कक्षा में के रूप में कुछ प्रोटोकॉल अनुरूपता की घोषणा हो सकती है?ओबीजेसी: क्या "कक्षा प्रोटोकॉल" जैसी कोई चीज है?</p> <pre><code>@protocol P <NSObject> - (void) someMethod ; @end @interface C : NSObject <P> @end @implementation C - (void) someMethod { } @end </code></pre> <p>लेकिन क्या कक्षाओं के बारे में:

मैं इस स्थिति में अपने आप को लगता है:

... 
Class c = [self modelClass:kind] ; 
if (c) { 
    model = [c performSelector: @selector(decode:) 
        withObject: [SExpIO read: [fm contentsAtPath:target]]] ; 
} 

और मैं मुझे घोषित करने के लिए वर्ग तरीकों के लिए प्रोटोकॉल के रूप में ऐसी बात नहीं है कि के लिए एक तरह से वहाँ थे कामना करते हैं।

उपरोक्त उदाहरण में, सभी वर्गों कि ग एक वर्ग उदाहरण हो सकता है (हममम ??) की घोषणा

+ (id) decode: (SExp *) root ; 

वहाँ एक रास्ता है कि मैं में ऊपर परिवर्तित कर है:

if (c) { 
    model = [c decode: [SExpIO read: [fm contentsAtPath:target]]] 
} 
एक उपयुक्त "वर्ग प्रोटोकॉल" घोषणा का उपयोग करके

?

उत्तर

7

वहाँ वर्ग के तरीकों के लिए प्रोटोकॉल के रूप में ऐसी बातें हैं, और वे कहा जाता है .... प्रोटोकॉल रहे हैं। उदाहरण के लिए, ऐसा लगता है कि आप एक प्रोटोकॉल है जो इस तरह दिखता हैं:

@protocol MyDecoder 
+ (id)decode:(SExp *)root; 
@end 

फिर आप इसे इस तरह उपयोग कर सकते हैं:

Class c = [self modelClass:kind]; 
if ([c conformsToProtocol:@protocol(MyDecoder)]) { 
    model = [c decode: [SExpIO read: [fm contentsAtPath:target]]]; 
} 
+0

उत्कृष्ट! धन्यवाद – verec

9

एक प्रोटोकॉल विधि घोषणाओं की एक सूची है। वे कक्षा के तरीके या उदाहरण विधियां हो सकती हैं। उदाहरण:

@protocol MyProtocol 

+ (id) aClassMethod; 
+ (void) someOtherClassMethod; 
- (void) someInstanceMethod; 

@end 
+0

आप ऐसा कर सकता है नहीं पता था ... साफ। – Steve

+0

वाह! मुझे उम्मीद नहीं थी! धन्यवाद!! मैंने कोशिश की और यह संकलित भी है, लेकिन मुझे परेशान है: कक्षा सी = [स्वयं मॉडल क्लास: दयालु]; वास्तव में कक्षा सी = एनएससीएलएएसफ़्रोस्ट्रिंग (@ "SomeClassThatIndeedImplementsModel") कहने का एक चौराहे तरीका है; यह कैसे संकलित करता है: यदि (सी) { मॉडल = [सी डीकोड: [SExpIO पढ़ा गया: [एफएम सामग्रीएपपाथ: लक्ष्य]]]; } "कक्षा" में स्वयं के पास कोई प्रकार की जानकारी नहीं है, ऐसा लगता है? – verec

+0

कक्षाएं उद्देश्य-सी में वस्तुएं हैं। कक्षाओं में मेटा-क्लासेस होते हैं, जो ऑब्जेक्ट भी होते हैं: 'टाइपपीफ स्ट्रक्चर objc_class * कक्षा; टाइपपीफ संरचना objc_object { कक्षा आईएसए; } * आईडी; ' –

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

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