это будет работать нормально ... Это не создаст никаких проблем.
рий
У меня есть ситуация, когда базовый класс называетсяAbstractRequest
имеет делегатное свойство типаid <AbstractRequestDelegate>
объявлено в заголовочном файле:
@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
Протокол абстрактного делегата содержит несколько обязательных методов, и, как указано словом «абстрактный», обаAbstractRequest
иAbstractRequestDelegate
предназначены для подклассов / расширены.
Одним из примеров этого может быть подкласс ConcreteRequest и расширенный протокол ConcreteRequestDelegates, которые оба добавляют дополнительные методы к абстрактным. Предполагается, что методы абстрактного и конкретного классов могут отправлять сообщения одному назначенному экземпляру делегата.
В определенный момент времени ConcreteRequest хотел бы вызвать метод для делегата, который определяется ConcreteRequestDelegate. Поскольку типом делегата является id, компилятор выдаст предупреждение о том, что этот метод может быть не реализован.
ConcreteRequest.m: 38: предупреждение: свойство 'делегат' требует определения метода '-delegate' - используйте @synthesize, @dynamic или предоставьте реализацию метода
Проблема
Это предупреждение оправдано, поскольку свойство в конце концов набраноid <AbstractRequestDelegate>
, Чтобы это исправить, я хочу прояснить для компилятора, что делегат, назначенный конкретному экземпляру, должен иметь типid <ConcreteRequestDelegate>
, Это звучало совершенно разумно для меня, поэтому я добавил новое свойство в заголовок ConcreteRequest, надеясь переопределить абстрактное:
@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;
Но это то, где компилятор не согласен со мной, вероятно, по уважительной причине. Я бы подумал, что это даст предупреждение за переопределение свойства суперкласса неправильным типом, но вместо этого он просто потребует от меня повторного синтеза этого нового свойства. Я не хочу туда идти, потому что тогда методы суперкласса не будут иметь доступа к тому же свойству делегата.
Вопрос
Есть ли способ повторно объявить свойство в конкретном подклассе с добавленной информацией о типе? Или вы можете заметить ошибку в моем мышлении, потому что, возможно, это довольно распространенная проблема, с которой я до сих пор не сталкивался?
Ура,
EP.
Постскриптум Все имена классов и протоколов, представленные в этой работе, являются вымышленными. Любое сходство с реальными именами классов и протоколов, с открытым исходным кодом или запатентовано, является чисто случайным.