target-c заменяет суперкласс классом - PullRequest
0 голосов
/ 10 марта 2012

возможно ли сделать что-то подобное в target-c (используя категории или что-то подобное): (псевдокод)

   abstract class Element extends Node {}

   class Object extends Element (and uses Sprite instead of Node) {}

   class Sprite extends Node {}

Одним из решений было бы поместить Node в качестве переменной-члена для Element, но тогда мне пришлось бы написать все функции-оболочки для класса Node. Можно ли как-нибудь его расширить?

спасибо!

1 Ответ

3 голосов
/ 10 марта 2012

Раньше это было возможно, но необходимая функция (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. Если вы не можете, то второй подход тоже отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...