Цель-с множественным наследованием
У меня есть 2 класса, один из которых включает methodA, а другой-methodB. Поэтому в новом классе мне нужно переопределить методы methodA и methodB. Итак, как мне добиться множественного наследования в objective C? Я немного запутался с синтаксисом.
3 ответа:
Objective-C не поддерживает множественное наследование, и вам это не нужно. Использовать состав:
@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
теперь вам просто нужно вызвать метод на соответствующем Иваре. Это больше кода, но просто нет множественного наследования как языковой функции в objective-C.
вот как я кодирую singletonPattern как "родитель" в основном я использовал комбинацию протокола и категории.
единственное, что я не могу добавить, это новый "Ивар", однако я могу нажать его с помощью связанного объекта.
#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>