J'ai 2 classes l'une inclut methodA et l'autre include methodB. Donc, dans une nouvelle classe, je dois remplacer les méthodes methodA et methodB. Alors, comment puis-je atteindre l'héritage multiple dans l'objectif C? Je suis un peu confondu avec la syntaxe.
Objective-C ne prend pas en charge l'héritage multiple et vous n'en avez pas besoin. Utilisez la composition:
@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
Maintenant, il vous suffit d’appeler la méthode sur l’ivar correspondant. C'est plus de code, mais l'héritage multiple n'est pas une fonctionnalité de langage dans Objective-C.
C’est ainsi que je code singletonPattern en tant que "parent". En gros, j’ai utilisé une combinaison de protocole et de catégorie.
La seule chose que je ne peux pas ajouter est un nouvel "ivar", cependant, je peux le pousser avec un objet associé.
#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
{
}
Chaque fois que je veux qu'une classe "hérite" de ce BGSuperSingleton, je fais juste:
#import "NSObject+singleton.h"
et ajoutez @interface MyNewClass () <BGSuperSingleton>