Подтвердить что ты не робот

Как переопределить свойство суперкласса с более конкретными типами?

Сценарий
У меня есть ситуация, когда базовый класс с именем AbstractRequest имеет свойство delegate типа id <AbstractRequestDelegate>, объявленное в файле заголовка:

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;

Протокол абстрактного делегата содержит несколько необходимых методов, и как указано в слове "абстрактный", оба AbstractRequest и AbstractRequestDelegate предназначены для подклассов/расширенных.

Одним из примеров этого может быть подкласс ConcreteRequest и расширенный протокол ConcreteRequestDelegates, который добавляет дополнительные методы к абстрактным. Цель состоит в том, что как абстрактные, так и конкретные методы класса могут отправлять сообщения одному назначенному экземпляру делегата.

В определенный момент времени ConcreteRequest хотел бы вызвать метод для делегата, который определен ConcreteRequestDelegate. Поскольку тип делегата является id, компилятор выдаст предупреждение о том, что этот метод не может быть реализован.

ConcreteRequest.m: 38: предупреждение: свойство 'delegate' требует метода '-delegate' для определения - используйте @synthesize, @dynamic или предоставить реализация метода

Проблема
Это предупреждение является оправданным, поскольку свойство все равно набрано id <AbstractRequestDelegate>. Чтобы исправить это, я хочу дать понять компилятору, что делегат, назначенный конкретному экземпляру, должен иметь тип id <ConcreteRequestDelegate>. Это звучало вполне разумно для меня, поэтому я ввел новое свойство в заголовок ConcreteRequest, надеясь переопределить абстрактный:

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;

Но здесь компилятор не согласен со мной, вероятно, не без оснований. Я бы подумал, что это даст предупреждение о переопределении свойства суперкласса с неправильным типом, но вместо этого он просто требует, чтобы я повторно синтезировал это новое свойство. Я не хочу туда идти, потому что тогда методы супер класса не будут иметь доступ к одному и тому же свойству делегирования.

Вопрос
Есть ли способ "повторно объявить" свойство в конкретном подклассе с добавленной информацией о типе? Или вы можете заметить ошибку в моих мыслях, возможно, это довольно распространенная проблема, с которой я до сих пор не сталкивался?

Cheers,
ЕР.

P.S. Все имена классов и протоколов, появляющиеся в этой работе, являются фиктивными. Любое сходство с реальными именами классов и протоколов, с открытым исходным кодом или запатентовано, является чисто случайным.

4b9b3361

Ответ 1

Предупреждение уже дало правильную подсказку. Я использовал @dynamic в переопределяющем подклассе, и все это хорошо.

Ответ 2

Просто синтезируйте id<ConcreteRequestDelegate>delegate в ConcreteRequest.m, он будет работать нормально... Это не создаст проблем.