У меня есть протокол.Совместное использование общего метода между классами, реализующими один и тот же протокол в Objective C
MyProtocol.h:
@protocol MyProtocol
@property(nonatomic, retain) NSString* someString;
- (void)doesSomethingWithSomeString;
@end
и 2 классов, которые реализуют один и тот же протокол. По какой-то причине 2 класса не могут наследовать один и тот же базовый класс. Например. 1 из них, возможно, потребуется наследовать от NSManagedObject (класс Core Data в структуре Apple Cocoa), а другой - нет.
Class1.h:
@interface Class1: NSObject<MyProtocol> {
NSString* someString;
}
//Some method declarations
@end
Class1.m
@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? (Думаю, мне нужно что-то вроде категорий для нескольких классов).
Update:
Там были некоторые предложения вспомогательного класса и делегирование звонков от Class1 и Class2 к нему. Это может быть хороший подход в целом, особенно если методы длинны.
В этом случае я рассматриваю Class1, наследующий от NSObject и Class2, наследующий от NSManagedObject. Последний является базовым классом, который Class2 должен подклассифицировать как модель/объект в структуре данных Apple Core Data.
Так что, хотя делегирование в третий класс является одним из способов сделать это, должно быть много кода оболочки делегирования делегирования, что составляет много коротких 1-2 методов в 3-м классе. т.е. высокий код делегирования шаблона для фактического кода.
Еще один момент, так как это модель класса, общий код в основном действует на Иварс/свойства, класс делегация будет в конечном итоге написано почти как глобальные функции C ..
Добавлено обновление в вопросе об использовании класса-помощника/делегированного. –