Раньше это было возможно, но необходимая функция (class_setSuperclass
) давно устарела и больше не может использоваться (что, вероятно, хорошо).
Есть несколько способов сделать это, некоторые лучше, чем другие.
Лучше, я думаю, было бы создать новый подкласс Element
с именем SpriteElement
, который имеет переменную-член Sprite
, а затем перенаправить все соответствующие методы sprite-ly на внутренний Sprite
экземпляр.
Вы также можете определить новый протокол, который фиксирует все, что вы хотите о Sprite
, например:
@protocol Sprite <NSObject>
- (void)doSpritelyThing;
@end
(я предполагаю, что класс Sprite
объявляет метод -doSpritelyThing
)
Затем, с категорией, вы можете объявить, что класс Element
соответствует протоколу <Sprite>
:
@interface Element (Sprite) <Sprite>
@end
И они реализуют метод так:
@implement Element (Sprite)
- (void)doSpritelyThing {
...
}
@end
Возможно, вы также захотите объявить, что класс Sprite
соответствует протоколу Sprite
:
@interface Sprite () <Sprite>
@end
Тогда в вашем коде вместо объявления переменных типа Element *
вы объявите их как id<Sprite>
(любой объект, который распознает сообщения из протокола <Sprite>
).
Первый подход хорош, если вы можете быть гибкими, если Element
отличается от Sprite
. Если вы не можете, то второй подход тоже отлично работает.