0

我正在创建一个初始化某些类的实例的类。这个类将用于初始化几个不同类型的类,这些类都是从一个公共超类继承而来的。目前我正在使用一个实例变量:

Class templateClass;

存储类类型。我收到编译器警告说模板类不支持方法。有没有办法抑制这些警告或指定模板类必须是某个类的子类?
另外,这是在objective-c中解决这个问题的理想方法吗?有没有不同的方法来指定我应该使用的类?
谢谢您的帮助!

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

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

2 回答 2

4

您可以定义一个包含所有必需方法的协议。然后声明您的类符合该协议。

于 2010-08-22T22:45:07.817 回答
1

编辑添加第二个替代方案

当我编译一个尝试做你正在做的事情的简单测试用例时,我没有收到那个警告(我也没有想到)。

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

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

此外,Vladimir 定义协议的建议是一个很好的建议,如果您这样做,您甚至可以插入运行时检查,以确保您获得的 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.
}

但是,作为所有这些的替代方法,您可以为工厂对象定义一个接口,而不是使用您的 Class 实例变量,以创建您想要的特定类型的 sprite。然后传入适当的工厂类实例。

例如:

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

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

然后创建一对子类:一个 Sprite 子类和一个创建这种 sprite 的 SpriteFactory 子类。

然后,您将拥有一个“SpriteFactory* 工厂”,而不是使用您的“类模板类”。

于 2010-08-23T00:33:36.693 回答