Это, вероятно, распространенный вопрос Objective-C, о котором сообщают Java-кодеры, но я не знаю, как его назвать или как искать ответ. Допустим, у меня есть класс и другой класс, который расширяет его:
AbstractModel
@interface AbstractModel {
}
ModelImpl
@interface ModelImpl : AbstractModel {
}
Отдельно от них у меня есть еще два класса, снова один расширяющий другой:
ControllerA
@interface ControllerA {
AbstractModel *foo;
}
@property (nonatomic, retain) AbstractModel *foo;
ControllerB
@interface ControllerB : ControllerA {
}
Я хочу сказать, что foo
в ControllerA может содержать AbstractModel или любой из его подтипов. Тем не менее, компилятор выдает мне предупреждение, если я пытаюсь сохранить в нем что-либо, кроме AbstractModel. (Конечно, я понимаю, что классы не могут действительно быть абстрактными в ObjC, но помилуют меня.)
Я также хотел бы иметь возможность "заблокировать" свойство foo
в определенных подклассах. Я хотел бы сказать, что foo
в ControllerB может содержать только ModelImpl4, например. Это возможно?
Какова общепринятая передовая практика Objective C для решения этого типа проблемы? Использует ли наследование таким образом - или для достижения этой цели - просто не очень хорошая идея в Objective-C?