Насколько я вас правильно понимаю, я попытаюсь объяснить:
1) Я согласен, что вы предпочитаете подписывать свой базовый класс на свой протокол, а не подписывать каждого ребенка
2) Если вы собираетесь использовать полиморфизм по протоколу, вы должны принести:
- (void)commonCalculator;
метод к протоколу, а не к базовому классу. Тогда вы сможете реализовать необходимую логику в нужном месте, как в базовом классе. Просто реализуйте этот метод там.
3) Также хотел бы дать совет:
Инженеры Apple любят использовать шаблон Class Cluster, это частный случай заводского шаблона. Итак, в файле .h у вас будет что-то вроде этого:
@protocol MyProtocol<NSObject>
@property (assign, nonatomic, readonly) NSInteger commonValue;
- (void)commonCalculator;
- (void)execute;
@end
typedef NS_ENUM(NSUInteger, BaseClassType) {
BaseClassTypeA,
BaseClassTypeB,
BaseClassTypeC
};
@interface BaseClass: NSObject<MyProtocol>
- (instancetype)initWithType:(BaseClassType)type;
@end
@interface SubclassA: BaseClass
@end
@interface SubclassB: BaseClass
@end
@interface SubclassC: BaseClass
@end
И через ваш код вы будете работать только с экземплярами базового класса, но под капотом это будут экземпляры конкретного подкласса. Итак, реализация вашего .m файла будет выглядеть так:
@implementation BaseClass
- (instancetype)initWithType:(BaseClassType)type {
switch (type) {
case BaseClassTypeA: {
self = [[SubclassA alloc] init];
}
case BaseClassTypeB: {
self = [[SubclassB alloc] init];
}
case BaseClassTypeC: {
self = [[SubclassC alloc] init];
}
}
return self;
}
@end
Как видите, это иллюстрирует пример того, как использовать шаблон стратегии (потому что у нас есть несколько стратегий, и относительно того, какой из них создан, будет выполнен необходимый метод, поэтому каждая стратегия инкапсулирует некоторый алгоритм под капотом, но он скрывается за общим интерфейсом) в сочетании с шаблоном Class Cluster (который является частным случаем шаблона Factory). Вы должны помнить, что не существует каких-либо строгих стандартов того, сколько методов вы будете вносить в протокол стратегии, если он гармонично интегрируется с дизайном вашего приложения.
Такой подход делает дизайн приложения очень изящным и понятным.