J'ai 2 classes l'une inclut methodA et l'autre include methodB. Donc, dans une nouvelle classe, je dois redéfinir 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.
Réponses
Trop de publicités?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 il n'y a tout simplement pas d'héritage multiple en tant que 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>