Как расширить метод класса, основанный на частных методах

#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