У меня есть протокол.
MyProtocol.h:
@protocol MyProtocol
@property(nonatomic, retain) NSString* someString;
- (void)doesSomethingWithSomeString;
@end
И 2 класса, которые реализуют тот же протокол.По некоторым причинам 2 класса не могут наследовать от одного и того же базового класса.Например, 1 из них может потребоваться наследовать от NSManagedObject (базовый класс данных в среде Apple Cocoa), в то время как другой не должен.*
@implementation Class1
@synthesize someString;
- (void)doesSomethingWithSomeString {
//don't use property here to focus on topic
return [[self someString] capitalizedString];
}
//Method definitions for methods declared in Class1
@end
Class2.h:
@interface Class2: SomeOtherClass<MyProtocol> {
NSString* someString;
}
//Some method declarations
@end
Class2.m
@implementation Class2
@synthesize someString;
// This is exactly the same as -doesSomethingWithSomeString in Class1.
- (void)doesSomethingWithSomeString {
//don't use property here to focus on topic
return [[self someString] capitalizedString];
}
//Method definitions for methods declared in Class2
@end
Как можно избежать дублирования -doesSomethingWithSomeString?(Полагаю, мне нужно что-то вроде категорий для нескольких классов).
Обновление:
Были некоторые предложения относительно вспомогательного класса и делегирования ему вызовов из Class1 и Class2.В целом это может быть хорошим подходом, особенно если методы длинные.
В этом случае я смотрю на Class1, наследующий от NSObject, и Class2, наследующий от NSManagedObject.Последний является базовым классом, из которого Class2 должен быть подкласс, как модель / сущность в рамках инфраструктуры Apple Core Data.
Так что, хотя делегирование в третий класс является одним из способов сделать это, необходимомного шаблонного кода-обертки делегирования для того, что составляет много коротких 1-2 методов в 3-м классе.т. е. высокий уровень делегирования кода для фактического соотношения кода.
Еще один момент: поскольку это модельный класс, общий код в основном действует на ivars / properties, в результате класс делегирования будет написан почти как глобальные функции Си..