В 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