2010-08-22 72 views
0

我正在做一个类来初始化某些类的实例。这个类将被用来初始化几个不同类的类,它们都是从一个普通的超类中分类出来的。目前我正在使用一个实例变量:我可以为类类型变量指定特定的超类需求吗?

Class templateClass; 

存储类的类型。我得到编译器警告,说templateClass不支持方法。有没有办法抑制这些警告或指定模板类必须是某个类的子类?
此外,这是在objective-c中执行此操作的理想方法吗?有没有不同的方式来指定我应该使用的类?
感谢您的帮助!

编辑: 我写的这个类是为了在随机选择的位置创建精灵并用一些变量来限制它们。这个类期望它激发的类有一个initWithX:(int)pos yVariance:(int)variance方法。我期望这可以使用你提到的协议来定义。我将为每个我必须创建的精灵类型创建rezzing类的多个实例。我希望能够发送重新分类initWithTemplateClass:(Class)templateClass来定义要创建的精灵的类型。我不确定这是否是正确的方法,但是因为编译器发布方法initWithX:(int)pos yVariance:(int)variance不适用于templateClass。我期待着我正在处理这个问题。 显示这条警告的代码是:

[self addChild:[[templateClass alloc] initWithX:positionOfChild 
    yVariance:(random()%(rowVarianceSize+1))]]; 
+0

也许你应该发布一些代码,显示你如何使用'templateClass'生成警告。 – imaginaryboy 2010-08-22 23:42:01

+0

刚刚添加了代码 – dhatch387 2010-08-23 00:04:24

回答

1

编辑添加第二个替代

我不明白的是警告(我也没有想到)当我编译试图做你在做什么,一个简单的测试用例。

这就是说,你在做什么似乎完全合理。尽管在'addChild'示例中确实存在泄漏。你分配/初始化你的新对象,留下它的保留计数为1,然后(假设'self'是一个UIView),你对addChild的调用也会保留这个对象,但是你没有你自己的引用来释放。

id obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]]; 
[self addChild:obj]; 
[obj release], obj = nil; 

此外,普京的建议,定义一个协议是一个很好的,如果你这样做,你甚至可以插入一个运行时检查templateClass给您提供符合该协议。

if ([templateClass conformsToProtocol:@protocol(Foo)]) { 
    id<Foo> obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]]; 
    [self addChild:obj]; 
    [obj release], obj = nil; 
} else { 
    // Do whatever you want to do if templateClass isn't correct. 
    // Obviously you could also have the protocol conformance check elsewhere. 
} 

然而,作为替代品所有这一切,而不是用类的实例变量,你可以定义为,创造您想要精灵的特定类型的工厂对象的接口。然后传入适当的工厂类实例。

例如:

@interface Sprite : UIView { 
} 
- (id)initWithX:(int)pos yVariance:(int)variance; 
@end 

@interface SpriteFactory { 
} 
- (Sprite*)createSprite; 
@end 

然后创建对亚类:一个Sprite子类,并且这产生那种精灵的SpriteFactory子类。

然后,而不是使用您的'类templateClass',你会有一个'SpriteFactory *工厂',而不是。

+0

非常感谢! – dhatch387 2010-08-23 01:08:14

4

您可以定义在它所有需要的方法protocol。然后声明你的类符合该协议。

+0

我需要让照顾初始化的类知道要初始化哪种类型。有没有更好的方法来做到这一点,然后使用'Class'类型来存储它? – dhatch387 2010-08-22 22:59:38

+0

我正在做一个游戏,一个班级照顾rezzing sprites。我想用它来rez多种类型的精灵,但我不确定是否使用Class类型是定义哪种精灵类型的正确方法。精灵是一个超类的所有不同的子类。 – dhatch387 2010-08-22 23:01:49

+0

对不起,我的回答并不完全是你需要的......你可以给你更多的信息,你想如何创建你的精灵,你如何通过类型的精灵...... – Vladimir 2010-08-22 23:20:40

相关问题