В Objective-C я могу добавлять методы к существующим классам с категорией, например
@interface NSString (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
Можно ли это сделать и с протоколами, т.е. если существует протокол NSString, что-то вроде:
@interface <NSString> (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
Я хочу сделать это, так как у меня есть несколько расширений для NSObject (класс), используя только общедоступные методы NSObject, и я хочу, чтобы эти расширения также работали с объектами, реализующими протокол.
Чтобы дать следующий пример, что, если я хочу написать метод logDescription, который печатает описание объекта в журнале:
- (void) logDescription {
NSLog(@"%@", [self description]);
}
Я могу, конечно, добавить этот метод к NSObject, но есть другие классы, которые не наследуются от NSObject, где я также хотел бы иметь этот метод, например. NSProxy. Поскольку метод использует только публичные члены протокола, лучше всего добавить его в протокол.
Изменить: Java 8 теперь имеет это с "методами виртуального расширения" в интерфейсах: http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf. Это именно то, что я хотел бы сделать в Objective-C. Я не видел, чтобы этот вопрос привлек это внимание...
С уважением, Jochen