2011-09-22 19 views
10

से कॉल करें मेरे पास दो वर्ग हैं, जिन्हें Parent और Child नाम दिया गया है। ParentChild का सुपरक्लास है, मैं कीवर्ड super का उपयोग कर अपने उप-वर्ग से सुपरक्लास की विधि को कॉल कर सकता हूं। क्या इसके सुपरक्लास से सबक्लास की विधि को कॉल करना संभव है?कॉल सुपरक्लास की विधि अपने सुपरक्लास

Child.h

#import <Foundation/Foundation.h> 
#import "Parent.h" 

@interface Child : Parent { 

} 

- (void) methodOfChild; 

@end 

Child.m

#import "Child.h" 

@implementation Child 

- (void) methodOfChild { 

    NSLog(@"I'm child"); 

} 

@end 

Parent.h:

#import <Foundation/Foundation.h> 

@interface Parent : NSObject { 

} 

- (void) methodOfParent; 

@end 

Parent.m:

#import "Parent.h" 

@implementation Parent 

- (void) methodOfParent { 

    //How to call Child's methodOfChild here? 

} 

@end 

आयात "Parent.h" एप्लिकेशन प्रतिनिधि के मीटर फ़ाइल शीर्षक में।

अनुप्रयोग प्रतिनिधि के application:didFinishLaunchingWithOptions: विधि ..

Parent *parent = [ [Parent alloc] init]; 

[parent methodOfParent]; 

[parent release]; 
+7

हां, यह तकनीकी रूप से संभव है लेकिन यह डिज़ाइन गंध करता है। सच में ख़राब। सुपरक्लास को अपने उप-वर्गों के बारे में पता नहीं होना चाहिए। –

+0

मैं इस तरह के पदानुक्रम में तरीकों को पहचानने में असमर्थ होने के लिए तेज़ी से बुलाया जाने पर, वही हासिल करना चाहता हूं। क्या कोई व्यक्ति स्विफ्ट क्लास से पहली कॉल शुरू होने पर एकजुट हो सकता है? – NaXir

उत्तर

58

आप कर सकते हैं, उद्देश्य सी विधि प्रेषण सभी गतिशील है के रूप में। बस इसे [self methodOfChild] के साथ कॉल करें, जो शायद एक कंपाइलर चेतावनी उत्पन्न करेगा (जिसे आप self से id पर कास्ट करके चुप कर सकते हैं)।

लेकिन, भलाई के प्यार के लिए, ऐसा मत करो। माता-पिता को अपने बच्चों के लिए, बच्चों को अपने माता-पिता के लिए नहीं देना चाहिए। उप-वर्गों के नए तरीकों के बारे में जानने वाले माता-पिता एक विशाल डिज़ाइन समस्या है, जिससे विरासत श्रृंखला को गलत तरीके से जोड़ना मजबूत होता है। अगर माता-पिता को इसकी ज़रूरत है, तो यह माता-पिता पर एक विधि क्यों नहीं है?

+1

शानदार रूप से लिखित और सही उत्तर। कुडोस! – sosborn

+7

संभवतः मूल पोस्टर सी ++ - स्टाइल अमूर्त बेस क्लास (यानी, जो विधियों को परिभाषित करता है लेकिन कार्यान्वयन प्रदान नहीं करता है) के संदर्भ में सोच रहा है, और सही सलाह है कि माता-पिता पर खाली कार्यान्वयन प्रदान करें, जिससे बच्चे को ओवरराइड छोड़ दिया जा सके अगर वे और केवल अगर यह प्रासंगिक है? – Tommy

+0

आपकी महान जानकारी के लिए धन्यवाद .. – Confused

2

super का अर्थ है "पैरेंट क्लास पर एक विधि प्रेषण का आह्वान करें", इसलिए उप-वर्ग में super का उपयोग कर सकते हैं क्योंकि उप-वर्ग में केवल एक मूल वर्ग होता है। हालांकि, किसी वर्ग में कई _sub_classes हो सकते हैं, तो सामान्य मामले में, आप किस विधि को कॉल करने के लिए कार्यान्वयन के बारे में जानेंगे? (इसलिए sub कीवर्ड जैसी कोई चीज़ नहीं है।)

हालांकि, आपके उदाहरण में आपके पास दो अलग-अलग विधियां हैं। आप रोक कुछ भी नहीं है, और कहा से (यह मानते हुए आप कुछ इस तरह से करने के लिए बहुत अच्छे कारणों है!) माता-पिता में

- (void) methodOfParent { 
    [self methodOfChild]; 
} 
+2

_why_ को उत्तर देने का गलत संकेत देना उपयोगी है। जैसा कि होता है, मेरा नहीं है: obj-c गतिशील रूप से प्रेषित करता है, 'सुपर' का अर्थ है "मेरे माता-पिता के विधि शब्दकोश से शुरू होने वाली विधि लुकअप करें", और आप _might_ के पास ऐसा कुछ करने का एक अच्छा कारण है जो अन्यथा भयानक लग रहा है। –

6

तकनीकी तौर पर आप यह कर सकते हैं। लेकिन मैं आपको अपने डिजाइन को बदलने का सुझाव देता हूं। आप एक प्रोटोकॉल घोषित कर सकते हैं और अपने बच्चे वर्ग को उस प्रोटोकॉल को अपना सकते हैं। फिर आपको यह जांचना पड़ सकता है कि बच्चा सुपर क्लास से उस प्रोटोकॉल को गोद लेता है और सुपर क्लास से विधि को कॉल करता है या नहीं।

+0

आपकी जानकारी के लिए धन्यवाद .. – Confused

+1

क्या आप प्रोटोकॉल के साथ ऐसा करने के लिए कुछ नमूना कोड प्रदान/साझा कर सकते हैं? – Confused

5

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

Parent.m

#import "Parent.h" 

@implementation Parent 

- (void) methodOfChild { 

    // this should be override by child classes 
    NSAssert(NO, @"This is an abstract method and should be overridden");  
} 

@end 

माता-पिता बच्चे के बारे में जानता है और बच्चे फ़ंक्शन को लागू करने पर एक विकल्प है।

0

अपने सुपर है यदि एक से अधिक बाद के चरणों फिर विशिष्ट उप विधि के लिए यह एक के लिए जाना

if ([super isKindOfClass:[specificsub class]]) { 
       [specificsub methodName]; 
      } 

अगर अपने सुपर उस वस्तु (है कि उप) तो उप विधि के साथ काम कर रहा है लॉग इन आपको एक अन्य तरीका कहा जाएगा सुपर क्लास

super *some = [[sub alloc] init]; 
[some methodName]; 
0

यह सबक्लास में विधि की सवारी करके किया जा सकता है। यह मूल वर्ग में एक विधि बना रहा है और उपclass में उसी पर सवारी कर रहा है।

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