2011-08-03 10 views
20

ऑब्जेक्टिव-सी में के अनुरूप है घोषित, यह एक विधि के लिए एक पैरामीटर के रूप में एक वर्ग पारित करने के लिए संभव है:एक ObjC पैरामीटर है कि एक कक्षा एक प्रोटोकॉल

- (void) methodThatTakesClass:(Class)theClass; 

और यह एक उदाहरण है कि पारित करने के लिए संभव है एक पैरामीटर के रूप में एक प्रोटोकॉल के अनुरूप:

- (void) myConformInstance:(id <MyProtocol>)theObject; 

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

उत्तर

12

हां। निम्नलिखित एक वैध प्रोग्राम है जो एनएसओब्जेक्ट क्लास को लॉग करेगा।

#import <Foundation/Foundation.h> 
void f(Class <NSObject> c) { 
    NSLog(@"%@",c); 
} 
int main() { 
    f([NSObject class]); 
} 

यह एक संकलक त्रुटि का कारण यदि आप एक वर्ग है जो इस तरह Object वर्ग के रूप में NSObject के अनुरूप नहीं है, पास करने का प्रयास करेंगे। आप विधियों के लिए भी इसका इस्तेमाल कर सकते हैं।

- (void)printClass:(Class <NSObject>)c; 
+2

से [प्रोटोकॉल] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html) : "क्लास ऑब्जेक्ट्स टाइप करने के लिए प्रोटोकॉल का उपयोग नहीं किया जा सकता है। केवल उदाहरणों को प्रोटोकॉल पर स्थिर रूप से टाइप किया जा सकता है, जैसे कि केवल क्लास को केवल क्लास में टाइप किया जा सकता है। (हालांकि, रनटाइम पर, दोनों कक्षाएं और उदाहरण एक अनुरूपता का जवाब देते हैंप्रोप्रोकॉल: संदेश।) " – albertamg

+0

@albertamg अच्छा लगता है। हालांकि, कम से कम कुछ कंपाइलर्स इसे देते हैं। नियम हो सकता है क्योंकि आप प्रोटोकॉल के अनुरूप कक्षा का प्रतिनिधित्व करने वाली वस्तु को नहीं बदल सकते हैं। – ughoavgfhw

-2

भी मान्य:

@interface Something: Object { 
} 
- (void) foo:(int(*)(void))bar; 
@end 

@implementation Something 
- (void) foo:(int(*)(void))bar { 
    return (*bar)(); 
} 
@end 

int someFunc(void) { 
    return 9; 
} 

int main (int argc, char **argv) { 
    Something *object = [[Something alloc] init]; 

    printf("%i\n", [object foo:&someFunc]); 

    [object release]; 

    return 0; 
} 
+0

यह एक पूरी तरह से अलग सवाल का जवाब प्रतीत होता है। –

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