web-dev-qa-db-fra.com

Héritage multiple Objective-C

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.

87
Dilshan

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.

133
d11wtq

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>

3
Septiadi Agus