2010-11-11 14 views
13

मैं ओब्जे-सी में एक ActiveRecord-esque बिट कोड लिखने का प्रयास कर रहा हूं, और निम्न स्थिति का सामना करना पड़ा: मैं बेस क्लास में स्थिर क्लास चर बनाने की कोशिश कर रहा हूं जो विरासत वर्ग का नाम प्राप्त करता है और इसमें परिवर्तित हो जाता है बहुवचन और कुछ अन्य स्वरूपण संचालन के साथ तालिका का नाम। मुझे पता है कि एक वर्ग है कि एक निम्नलिखित की तर्ज पर कुछ कर सकते हैं का एक उदाहरण के लिए:कक्षा के तरीकों के लिए स्वयं की तरह कुछ है?

tableName = [[[self class] description] stringToTableName]; 

बहरहाल, यह एक self उपयोग करने के लिए की आवश्यकता है। क्या लाइनों के साथ कुछ करना संभव है?

tableName = [[[inheriting_class class] description] stringToTableName]; 

मैं विरासत वर्ग वस्तुओं के प्रत्येक उदाहरण के लिए तालिका नाम का पुनर्मूल्यांकन करना पसंद नहीं करूंगा। मैं इस कोड का कोड भी रूबी-शैली मेटाप्रोग्रामिंग के साथ टेबल नाम को स्वत: उत्पन्न करना पसंद करूंगा।

उत्तर

21

बस [self class] का उपयोग करें! जब आप उद्देश्य-सी में कक्षा विधि को कॉल करते हैं, self इंगित करेगा कि कौन सी कक्षा कॉल कर रही है। उदाहरण के लिए:

#import <Foundation/Foundation.h> 
#import <stdio.h> 

@interface A: NSObject 
+ (void)foo; 
@end 

@implementation A 
+ (void)foo { 
    printf("%s called!", [[[self class] description] UTF8String]); 
} 
@end 

@interface B: A @end 
@implementation B @end 

int main() 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [A foo]; 
    [B foo]; 
    [pool release]; 
    return 0; 
} 

कैसे के बारे में का उपयोग कर NSStringFromClass() (और NSStringFromSelector() अगर वांछित)

A called! 
B called! 
+12

+1, हालांकि आप केवल '[स्वयं वर्ग]' के बजाय 'स्वयं' कर सकते हैं। एक वर्ग विधि में, 'स्वयं' * 'वर्ग' है। –

+1

@ डेव, सच; मैंने हमेशा यह स्पष्ट करने के लिए '[स्वयं वर्ग]' लिखना पसंद किया है कि मैं एक कक्षा की तलाश में हूं। –

+0

इस परिदृश्य में, आप foo विधि में एक चर कैसे घोषित करेंगे जो या तो ए या बी हो सकता है जिस पर यह वर्ग कॉल करता है? कुछ ऐसा: टाइपफ (स्वयं) रिकॉर्ड = [[[स्वयं वर्ग] alloc] init] ;? या आईडी इसे करने का एक संतोषजनक तरीका है? – iand675

0

मुद्रित करना चाहिए?

NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); 
संबंधित मुद्दे