#objective-c #cocoa #delegates #private-members
#objective-c #cocoa #делегаты #private-члены
Вопрос:
Допустим, у меня есть класс со следующей структурой, и я хочу переопределить один из его методов делегирования (или несколько, в общем, один из его общедоступных методов), но теперь он основан на некоторых частных методах. Есть ли способ его расширить или я должен просто сделать вывод, что он не был разработан с учетом расширяемости?
MyBaseClass.h:
@interface MyBaseClass : UIView <UITableViewDataSource, UITableViewDelegate>
{
}
// some public methods
@end
MyBaseClass.m:
@interface MyBaseClass (Private)
- (void)_privateMethod1;
- (void)_privateMethod2;
@end
#pragma mark - UITableViewDataSource
// ------ I'D LIKE TO CHANGE THE BEHAVIOR OF THIS METHOD EXTENDING MyBaseClass
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)rowIndexPath {
[self _privateMethod1];
[self _privateMethod2];
}
@end
Мне также нужно обратиться к частным методам, если я действительно буду продолжать расширять класс, но, очевидно, я не хочу получать доступ к какому-либо частному методу.
Извините, если вопрос звучит немного тривиально.
Спасибо
Ответ №1:
Вы можете объявить свои частные методы в отдельном заголовке MyBaseClassPrivate.h вместо файла реализации и импортировать его в подкласс.
Ответ №2:
Не могли бы вы создать протокол, в котором вы объявляете методы, которые должны реализовывать подклассы? Базовый класс будет использовать этот протокол; а подклассы отвечают за их соответствующую реализацию. Реализация базового класса может обеспечить некоторую общую функциональность или просто return;
@protocol MyBaseClassPrivateProtocol
- (void)_privateMethod1;
- (void)_privateMethod2;
@end
@interface MyBaseClass : UIViewController <MyBaseClassPrivateProtocol>
@end
Комментарии:
1. Это может вызвать проблемы, если, например, вы создаете фреймворк и не хотите, чтобы люди, которые его используют, знали о MyBaseClassPrivateProtocol