我处理这个问题的主要方法实际上是由我正在阅读的一本 PHP 书教给我的。显然 PHP 不像 Objective C 那样严格,所以我不得不做一些改变。
我觉得这是一个非常有用的技能,知道如何去做,特别是对于游戏程序员来说,一个数组可能需要携带数百个对象,所有对象都仅限于某种类型。
继承的好处是,子类也采用其父/祖父类的“类型”(如果您的类树很长,则尽可能向上)。
例如,如果我有一个具有 parentObj 类型参数的方法,您可以将它的任何子项放入该参数槽中,然后代码将运行。
- (BOOL) addObjectToArray: (parentObj *) obj {
[array addObjectToArray:obj];
return true;
}
BOOL worked = [self addObjectToArray:childClass1];
[self addObjectToArray:childClass2];
[self addObjectToArray:childClass3];
[self addObjectToArray:otherClass1];
代码将一直运行到最后一行,在该行中将无法正常工作。otherClass1 不是 parentObj 类型,所以它不起作用。这成功地使我们能够以一种简单的方法限制数组可以容纳的类的类型!
现在从对象中读取参数是我们下一步要解决的问题。我敢肯定还有其他更简单的方法可以做到这一点,但这就是我的做法。
我在超类(一个整数)中放置了一个参数,该参数将为子类保存一个所谓的 ID。
parentObj.h:
//...
- (id) initWithProperties...:() :() :()... andID: (int)idType;
@property(nonatomic) int type;
//...
parentObj.m:
//...
- (id) initWithProperties...:() :() :()... andID: (int)idType {
//...
self.type = idType;
//...
}
//...
childClass1.h:
//...
@property(nonatomic) int someOtherPropertyOfChild1;
//...
childClass1.m:
//...
- (id) init {
self = [super initWithProperties... ...andID:1];
if (self) {
}
return self;
}
//...
childClass2.h:
//...
@property(nonatomic) int someOtherPropertyOfChild2;
//...
childClass2.m:
//...
- (id) init {
self = [super initWithProperties... ...andID:2];
if (self) {
}
return self;
}
//...
ETC...
您需要记住哪个 ID 与哪个子类相关联,否则您一定会出错。
所以现在说你有一个循环遍历数组中所有对象的循环。假设我们需要在每个子类中打印出那个额外的参数,我们该怎么做呢?我会告诉你怎么做。
假设在for循环中迭代的变量是x。
switch([array objectAtIndex:x].type) {
case 1:
//remember that childClass1 is id of one
childClass1 *CC1 = [array objectAtIndex:x];
NSLog(@"%d", CC1.someOtherPropertyOfChild1);
break;
//...
如果调用了默认情况,则意味着它从数组中获取的对象是 parentObj 对象,或者是未正确 ID 的子类。
我希望这可以帮助您解决问题,并希望它可以帮助您理解为什么继承很重要,以及为什么要使用它!