0

如果有限的对象都是从超类继承的,如何限制放入数组中的对象的类型?

因此,例如,我有一个名为的父类

parentObj

然后,我有 3 个子类,这些子类具有已添加的参数并且对超类 (parentObj) 不可用

childClass1
childClass2
childClass3

然后我有一些其他不相关的类,但我想远离我正在尝试建立的数组

otherClass1
otherClass2

我有这个可变数组

NSMutableArray *arrayOfChildren;

我想主要由 parentObj 的三个子类构建,并且不能包含 otherClasses

我不想为每个子类构建不同的方法来读取子类并将其写入数组,因为我很可能会构建更多的子类!

我怎样才能有一种方法将这些类添加到数组中,并有一种方法来读取它们,包括孩子添加的参数?

4

2 回答 2

0

创建用于将对象添加到数组的包装器方法:

- (void)addObject:(id)object
{
    if ([object isKindOfClass:[parentObj class]])
    {
        [self.arrayOfChildren addObject:object];
    }
}

isMemberOfClass如果您还想排除parentObj类本身的实例,还可以添加一个检查。

于 2013-07-03T06:57:32.820 回答
0

我处理这个问题的主要方法实际上是由我正在阅读的一本 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 的子类。

我希望这可以帮助您解决问题,并希望它可以帮助您理解为什么继承很重要,以及为什么要使用它!

于 2013-07-03T06:06:04.113 回答