【问题标题】:Can I specify a specific superclass requirement for a class type variable?我可以为类类型变量指定特定的超类要求吗?
【发布时间】:2010-08-22 22:37:06
【问题描述】:

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

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))]];

【问题讨论】:

  • 也许您应该发布一些代码来显示您如何使用生成警告的“templateClass”。

标签: iphone objective-c dynamic-typing


【解决方案1】:

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

【讨论】:

  • 我需要让负责初始化的类知道要初始化哪种类型。有没有更好的方法来做到这一点,然后使用 Class 类型存储它?
  • 我正在制作一个游戏,一个班级负责重新调整精灵。我想用它来 rez 多种类型的 sprite,但我不确定使用 Class 类型是否是定义它应该 rez 的 sprite 类型的正确方法。精灵都是一个超类的不同子类。
  • 抱歉,我的答案似乎不是您所需要的...您能否提供更多信息,说明您想如何创建精灵,如何传递精灵类型...
  • 刚刚编辑了包含一些信息的帖子。如果您需要更多信息,请告诉我。
  • 我发现了一个与此引用协议使用相关的问题。我只是不确定我做事的方式是否存在基本的设计问题。它的地址是:stackoverflow.com/questions/3278442/…
【解决方案2】:

已编辑以添加第二个替代方案

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

也就是说,你所做的似乎完全合理。尽管您在“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* 工厂”,而不是使用您的“类模板类”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多