objective-c用类替换超类

时间:2012-03-10 16:52:28

标签: objective-c

是否可以在objective-c(使用类别或类似的东西)中执行类似的操作: (伪代码)

   abstract class Element extends Node {}

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

   class Sprite extends Node {}

一种解决方案是将Node作为成员变量放到Element中,但是我必须编写Node类的所有包装函数。是否有可能以某种方式扩展它?

谢谢!

1 个答案:

答案 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>协议的消息的对象)。


如果您可以灵活地使ElementSprite不同,那么第一种方法就可以了。如果你做不到,那么第二种方法也很有效。