2011-09-02 19 views
25

क्या कक्षा में किसी अन्य विधि से कक्षा विधि को कॉल करने का कोई तरीका है?उस कक्षा के भीतर से कक्षा वर्ग को कॉल करें

उदाहरण के लिए:

[MyClass classMethodA]; 

अगर वह काम नहीं कर रहा, सुनिश्चित करें कि आप विधि हस्ताक्षर वर्ग के इंटरफ़ेस में परिभाषित किया गया है बनाने:

+classMethodA{ 
} 

+classMethodB{ 
    //I would like to call classMethodA here 
} 
+0

सबसे पहले लिखने की ज़रूरत? विधि कैसे कॉल करें? यह obj-c में यह कहने का एक तरीका है। – doNotCheckMyBlog

+0

क्या आपने इसे आजमाया? क्या हुआ? –

+0

@Craftero क्या आप किसी ऑब्जेक्ट को संदेश भेजना नहीं चाहते हैं? संदेश विधियों को नहीं भेजे जाते हैं। –

उत्तर

8

के रूप में सरल होना चाहिए। (आमतौर पर एक .h फ़ाइल में)

+1

ऑब्जेक्ट को संदेश भेजता है यह करने का एक तरीका है; हालांकि, वह उप-वर्गीकरण का सम्मान नहीं करेगा। ज्यादातर मामलों में [self classMethodA] का उपयोग करना शायद बुद्धिमान है। जैसा कि मैं एक वर्ग विधि में समझता हूं "स्वयं" कक्षा वस्तु होगी (क्योंकि वर्ग विधियां कक्षा के उदाहरण विधियां हैं)। तो MyClass की विधि को बुलाया जाएगा, लेकिन MyClassSubclass के वर्ग MethodA – csga5000

+0

यह भी ध्यान दें कि उन्होंने "उसी कक्षा के भीतर" प्रश्न में कहा था – csga5000

3

निश्चित रूप से। self वर्ग संदेश भेजा जा रहा है को संदर्भित करता है,

+ (id)person { 
    return [[self class] personWithFirstName:@"John" lastName:@"Doe"]; 
} 

+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast { 
    return [[[[self class] alloc] initWithFirstName:aFirst lastName:aLast] 
                 autorelease]; 
} 
59

एक वर्ग विधि में:

आप इन तरीकों में परिभाषित किया गया है कहते हैं: इस प्रकार

@interface MDPerson : NSObject { 
    NSString *firstName; 
    NSString *lastName; 

} 

+ (id)person; 
+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 
- (id)initWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 


@property (copy) NSString *firstName; 
@property (copy) NSString *lastName; 

@end 

पहले 2 वर्ग तरीकों से लागू किया जा सकता है। तो एक और वर्ग विधि के भीतर से (कहना classMethodB), उपयोग:

- (void)instanceMethodB 
{ 
    // ... 
    [[self class] classMethodA]; 
    // ... 
} 

नोट है कि न तो presumes जो वर्ग आपको संदेश सेवा कर रहे हैं:

+ (void)classMethodB 
{ 
    // ... 
    [self classMethodA]; 
    // ... 
} 

एक उदाहरण विधि (मान लें instanceMethodB), उपयोग के भीतर से। वास्तविक वर्ग उप-वर्ग हो सकता है।

+1

आपने अपनी शब्दावली को बदल दिया है। उदाहरण विधियों के लिए '[स्वयं foo]' वर्ग विधियों के लिए '[MyClass बार]'। –

+8

नहीं। 'स्वयं' का अर्थ इस बात पर निर्भर करता है कि आप क्या संदेश भेज रहे हैं। यदि आप कक्षा को संदेश देते हैं, तो 'स्वयं' कक्षा है। यदि आप एक उदाहरण संदेश भेजते हैं, तो 'स्वयं' उदाहरण है। मैं http://qualitycoding.org/factory-method/ –

+0

में वर्ग विधियों के लिए संदेश स्वयं के महत्व की व्याख्या करता हूं, सहमत हूं कि आप अपनी टिप्पणी में क्या कह रहे हैं, लेकिन आपके उत्तर में शब्दावली सचमुच पीछे की ओर है। एक उदाहरण विधि में '[स्वयं वर्ग]' का उपयोग करना ज्यादा समझ में नहीं आता है, लेकिन यह कक्षा विधि में पूर्ण ज्ञान देता है। याद रखें कि उदाहरण विधियां '-' से शुरू होती हैं, कक्षा विधियां' + 'से शुरू होती हैं, और किसी ऑब्जेक्ट के उदाहरण को संदर्भित करने के लिए 'self' का उपयोग करके वाक्य रचनात्मक अर्थ होता है लेकिन किसी ऑब्जेक्ट के उदाहरण को संदर्भित करने के लिए' [self class] 'का उपयोग करना होता है वाक्य रचनात्मक रूप से कोई मतलब नहीं है। '[स्वयं वर्ग] 'कक्षा का वर्णन करने वाली किसी वस्तु के संदर्भ में संदर्भित करता है, न कि कक्षा का एक उदाहरण। –

4

उद्देश्य सी 'स्वयं' का उपयोग उसी वर्ग के भीतर अन्य विधियों को कॉल करने के लिए किया जाता है।

तो आप बस हम कहते हैं कि कैसे विधि करने के लिए संदेश भेजने के लिए

+classMethodB{ 
    [self classMethodA]; 
} 
+1

'स्वयं' उदाहरण विधियों के लिए केवल उचित है, लेकिन सवाल से पता चलता है कि वह बात कर रहा है वर्ग विधियों के बारे में (विधि नाम से पहले '+' चिह्न के साथ) –

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