2011-07-28 12 views
20

में ओवरराइडिंग विधि मुझे अपने उप-वर्गों में से किसी एक विधि को सटीक रूप से ओवरराइड करने के लिए घंटे लगने में कुछ परेशानी हो रही है।उद्देश्य-सी - सबक्लास

@interface ClassB : ClassA { 
} 

और ClassA भीतर, वहाँ एक विधि कहा जाता है:

-(void)methodName; 

जो सही ढंग से आग

मैं उपवर्ग एक और customclass की (ClassB) (ClassA) है।

हालांकि, मुझे ClassB में आग लगाने के लिए इस विधि की आवश्यकता है।

मैं (ClassB में) को लागू करने की कोशिश की है:

-(void)methodName { 
    [super methodName]; 
} 

लेकिन यह अभी भी ClassB में सक्रिय नहीं होगा।

मैं विधि नाम को ओवरराइड कैसे कर सकता हूं ताकि यह ClassB में आग लगे?

+0

आप ऑब्जेक्ट को कैसे प्रारंभ करते हैं? – Thys

उत्तर

25

तुम बस classB में methodName में अपने कस्टम कोड जोड़ें:

- (void)methodName 
{ 
    // custom code 

    // call through to parent class implementation, if you want 
    [super methodName]; 
} 
+6

वही है जो उसने पहले ही किया था ... –

+3

वह यह नहीं कहता कि वह वास्तव में अपना जोड़ा कोड कहां रखता है .. इसके अलावा, यह करने का यह सही तरीका है। –

+0

आपको [सुपर विधिनाम] को हटाने की ज़रूरत नहीं है; कक्षाबी में विधि नाम चलाने के लिए .. –

18

सबसे पहले, सुनिश्चित करें कि आपकी init विधि क्लासब ऑब्जेक्ट बनाता है, क्लास (या कुछ और नहीं) ऑब्जेक्ट।

उसके बाद, आप एक पूरी तरह से अलग classB (शून्य) methodName बनाना चाहते हैं: एक ClassA में पाया की तुलना में विधि, इस जाने का रास्ता है:

सुपर सुपर क्लास है। [सुपर विधिनाम] को कॉल करके आप क्लासए को अपनी विधि नाम निष्पादित करने के लिए कह रहे हैं। यदि आप कक्षा ए से विधिनाम को पूरी तरह से ओवरराइड करना चाहते हैं, तो बस सुपर कॉल न करें।

तो, मूल रूप से, methodName के अपने classB के क्रियान्वयन में:

-(void)methodName { 
    // Remove [super methodName] 
    // Insert the code you want for methodName in ClassB 
} 

एप्पल के ऑब्जेक्टिव-सी प्रोग्रामिंग भाषा दस्तावेज़ में Messages to self and super पढ़ने के लिए स्वतंत्र महसूस।

+0

क्या यह इस प्रश्न के लिए सही उत्तर नहीं है? – arqam

0

लेखन द्वारा:

-(void)methodName { 
    [super methodName]; 
} 

आप संकलक बताओ: जब कक्षा बी के methodName को क्रियान्वित करने, अपने सुपर क्लास की methodName (फोन कक्षा)। तो यदि आप कक्षा बी को कुछ अलग करना चाहते हैं तो आपको कोड लिखना होगा जिसके परिणामस्वरूप एक अलग व्यवहार हो। इस तरह:

-(void)methodName { 
    NSLog(@"Hello, world!"); 
} 

अब क्लास बी के विधि नाम को कॉल करके "हैलो, दुनिया!" कंसोल पर मुद्रित किया जाएगा।

0
-(void)methodName { 
    [super methodName]; 
} 

कॉल विधि नाम (क्लासबी में) कॉल करना चाहते हैं, बस [सुपर विधि] को हटा दें, फिर आप इसे आग लगा सकते हैं। कारण सुपर क्लास

-1

हालांकि यह प्रश्न बहुत पुराना है, लेकिन कुछ विशेषज्ञों के रूप में कुछ सीखने वाले हैं, निम्नलिखित एप्पल दस्तावेज़ों से उद्धृत किया गया है। "नई विधि में एक ही रिटर्न प्रकार होना चाहिए और उसी विधि और पैरामीटर को टाइप करें जो आप ओवरराइड कर रहे हैं।" पूर्ण उत्तर Apple method overriding documentation में पाया जा सकता है उम्मीद है कि यह किसी की सहायता करता है।

+0

स्टैक ओवरफ़्लो सभी दस्तावेज़ों की प्रतिलिपि नहीं लेनी चाहिए। चूंकि ओपी ने यह गलत नहीं किया है, यह सवाल का जवाब नहीं दे रहा है। – vikingosegundo

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