2013-11-21 4 views
0

У меня есть собственный класс C, наследующий UIView, в котором я определил некоторые распространенные методы.Проблема с наследованием и расширение классов рамки

Теперь я хочу, чтобы объект UITextView A и объект UIView B имели эти методы. Для B мне просто нужно сменить отца на C.

Но что мне делать с A? Я не могу напрямую изменить своего отца на C, потому что иначе я потеряю методы UITextView.

Также я не могу (и не хочу) использовать категорию, потому что в C у меня есть некоторые свойства и переменные-члены.

+0

Категории и единичное наследование являются инструментами. Нам нужно посмотреть на особенности, чтобы увидеть, как еще вы могли бы достичь своей цели. Но нет другой альтернативы, подобной наследованию, если это то, на что вы надеетесь. – danh

ответ

1

Множественное наследование не является объектом Objective-C. В лучшем случае вы можете иметь как ваш подкласс UITextView, так и ваш подкласс UIView реализовать общий протокол. Конечно, это будет означать, что вам придется дублировать код.

Я считаю, вы можете добиться желаемого эффекта с помощью категорий. Вы можете добавлять свойства во время выполнения Усиливая ObjC/runtime.h (заимствованный из NSHipster)

#import "UIView+MyView.h" 
#import <objc/runtime.h> 

static const void *IndieBandNameKey = &IndieBandNameKey;  

@implementation UIView (MyView) 
@dynamic indieBandName; 

- (NSString *)indieBandName { 
    return objc_getAssociatedObject(self, IndieBandNameKey); 
} 

- (void)setIndieBandName:(NSString *)indieBandName { 
    objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

@end 

Поскольку UITextView подкласс UIView, методы вы положили в категорию UIView будет применяться к вашему UIView подклассу, а также вашему UITextView подкласс. Кроме того, вы также сможете получить доступ к этим динамически созданным свойствам в ваших методах категорий, что позволит вам использовать эти «переменные-члены», которые вы сейчас объявили.

Смежные вопросы