के माध्यम से उद्देश्य सी में एक विधि ओवरराइड निम्नलिखित उद्देश्य सी में काम कर रहा है:श्रेणी
// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject
- (NSString *) myMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
@end
//Category in ClassA+CategoryB.h and ClassA+CategoryB.m
@interface ClassA (CategoryB)
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end
सवाल है, अगर मैं सिर्फ ClassA.h का आयात कर रहा हूँ और संदेश भेजें
[myClassA myMethod]; //returns B
क्यों क्या यह B
लौट रहा है? मैं ClassA + CategoryB का आयात नहीं कर रहा हूँ
भी futhrer, अगर मैं निम्नलिखित किया:
// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject
- (NSString *) myMethod;
- (NSString *) mySecondMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
- (NSString *) mySecondMethod { return [self myMethod]; }
@end
//Category in ClassA+CategoryB.h and ClassA+CategoryB.m
@interface ClassA (CategoryB)
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end
और फोन mySecondMethod:
ClassA *a = [[ClassA alloc] init];
NSLog(@"%@",[a myMethod]);
परिणाम अभी भी B
हो जाएगा, हालांकि कोई नहीं जानता (कारण कोई आयात नहीं) श्रेणी कार्यान्वयन के ?!
मैं अपवादित था, केवल B
वापस जाने के लिए अगर मैं श्रेणी का आयात किया गया था ...
इसलिए किसी भी संकेत की सराहना की।
मुझे आपके प्रश्न का उत्तर नहीं पता है, लेकिन श्रेणियां आमतौर पर कक्षा में नए तरीकों को जोड़ने के लिए होती हैं, मौजूदा लोगों को ओवरराइड नहीं करने के लिए। यदि आप ऐसा करना चाहते हैं, तो आपको इसे उप-वर्ग करना चाहिए। – Levi
श्रेणियों में ओवरराइडिंग विधियों के परिणाम अपरिभाषित व्यवहार में: बिंदु में मामला। – CodaFi
धन्यवाद उत्तर आपके उत्तर के लिए, मुझे पता है कि मैं सीखने के उद्देश्यों के लिए उपरोक्त उदाहरण पर सवाल कर रहा था ... मुझे उम्मीद नहीं थी, इसलिए मैं पूछ रहा हूं। – Alexander