Как переопределить метод получения приватной собственности суперкласса - PullRequest
0 голосов
/ 13 мая 2018

Обычно мы можем использовать следующий код для установки метода-получателя для свойства.

- (UIButton *)aButton {
    if (!_aButton) {
        _aButton = [UIButton buttonWithType:UIButtonTypeCustom];
    }
    return _aButton;
}

Теперь свойство объявлено в файле .m суперкласса.
Итак.
Вопрос: Как это сделать в подклассе?

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете просто объявить о существовании частных методов в суперклассе в заголовке категории, а затем использовать их.Вы не можете назначить частную переменную экземпляра напрямую из суперкласса, кроме как с помощью setValue: forKey: или других функций времени выполнения, таких как object_setIvar ().

@interface Superclass (PrivateDecls)
@property (nonatomic, strong) UIButton *aButton;
@end

@implementation Subclass
...
- (UIButton *)aButton {
    UIButton *button = [super aButton];
    if (!button) {
        button = [UIButton buttonWithType:UIButtonTypeCustom];
        [super setAButton:button];
    }
    return button;
}
@end

Однако обычно такие свойства объявляются в частном порядке по причине.Они могут изменяться с каждым выпуском и т. Д., И ваш код может легко сломаться в будущем.Даже если ваши собственные классы изменяются, программист, изменяющий код в суперклассе, может не знать, что в проекте есть другой класс, переопределяющий его, и может легко внести критические изменения.

Обычно единственная причина для этоготакие вещи предназначены для модульных тестов, временного кода отладки или для двух тесно связанных классов, где только другой класс должен знать о закрытых методах private / package, а не о любом другом классе - в противном случае суперкласс должен просто объявить их в открытом доступе.заголовок.Даже в этой последней ситуации может иметь смысл создать заголовок «SuperclassPrivate.h» или «SuperclassProtected.h» для объявления методов / свойств, используемых другими связанными классами (такими как UIGestureRecognizerSubclass.h), чтобы некоторые другие классы могли импортировать этотзаголовок, не будучи публичным для общего пользования.Если вы пойдете по этому пути, может быть лучше добавить комментарии в суперкласс, чтобы указать, что есть другой класс, переопределяющий рассматриваемое свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...