是否可以在objective-c(使用类别或类似的东西)中执行类似的操作: (伪代码)
abstract class Element extends Node {}
class Object extends Element (and uses Sprite instead of Node) {}
class Sprite extends Node {}
一种解决方案是将Node作为成员变量放到Element中,但是我必须编写Node类的所有包装函数。是否有可能以某种方式扩展它?
谢谢!
答案 0 :(得分:3)
这曾经是可能的,但必要的功能(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
不同,那么第一种方法就可以了。如果你做不到,那么第二种方法也很有效。