Сценарий
У меня есть ситуация, когда базовый класс с именем 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. Все имена классов и протоколов, появляющиеся в этой работе, являются фиктивными. Любое сходство с реальными именами классов и протоколов, с открытым исходным кодом или запатентовано, является чисто случайным.