मेरे पास 2 कक्षाएं हैं जिनमें एक मेथड शामिल है और दूसरा मेथडब शामिल है। इसलिए एक नई कक्षा में मुझे मेथड मेथड और मैथड बी से आगे निकलने की जरूरत है। तो मैं उद्देश्य सी में कई विरासत कैसे प्राप्त करूं? मैं वाक्य रचना के साथ थोड़ा भ्रमित हूँ।
जवाबों:
उद्देश्य-सी कई उत्तराधिकार का समर्थन नहीं करता है, और आपको इसकी आवश्यकता नहीं है। संरचना का उपयोग करें:
@interface ClassA : NSObject {
}
-(void)methodA;
@end
@interface ClassB : NSObject {
}
-(void)methodB;
@end
@interface MyClass : NSObject {
ClassA *a;
ClassB *b;
}
-(id)initWithA:(ClassA *)anA b:(ClassB *)aB;
-(void)methodA;
-(void)methodB;
@end
अब आपको बस संबंधित आइवर पर विधि लागू करने की आवश्यकता है। यह अधिक कोड है, लेकिन वस्तुनिष्ठ-सी में भाषा की विशेषता के रूप में सिर्फ एक ही वंशानुक्रम नहीं है।
ClassAऔर जरूरत नहीं है ClassB? बुला करता है methodA:पर MyClassकिसी भी तरह स्वचालित रूप से फोन methodA:पर ClassA?
यह है कि मैं एक एकल "माता-पिता" के रूप में सिंग्लटनपैट कोड को कोड करता हूं मूल रूप से मैंने प्रोटोकॉल और श्रेणी के संयोजन का उपयोग किया था।
केवल एक चीज जो मैं नहीं जोड़ सकता वह एक नया "आइवर" है, हालांकि, मैं इसे संबंधित ऑब्जेक्ट के साथ धक्का दे सकता हूं।
#import <Foundation/Foundation.h>
@protocol BGSuperSingleton
+(id) singleton1;
+(instancetype)singleton;
@end
@interface NSObject (singleton) <BGSuperSingleton>
@end
static NSMutableDictionary * allTheSingletons;
+(instancetype)singleton
{
return [self singleton1];
}
+(id) singleton1
{
NSString* className = NSStringFromClass([self class]);
if (!allTheSingletons)
{
allTheSingletons = NSMutableDictionary.dictionary;
}
id result = allTheSingletons[className];
//PO(result);
if (result==nil)
{
result = [[[self class] alloc]init];
allTheSingletons[className]=result;
[result additionalInitialization];
}
return result;
}
-(void) additionalInitialization
{
}
जब भी मैं इस BGSuperSingleton मैं "विरासत" के लिए एक वर्ग चाहता हूं
#import "NSObject+singleton.h"
और जोड़ @interface MyNewClass () <BGSuperSingleton>
क्या आप प्रोटोकॉल के बारे में जानते हैं, प्रोटोकॉल कई वंशानुक्रम को लागू करने का तरीका है
JAVA, Interfacesकई विरासत प्रदान करने या नकल करने के लिए नहीं हैं।