Objective c 目标C—如何使用继承限制输入到方法或数组中的类的类型,并在以后读取这些对象?

Objective c 目标C—如何使用继承限制输入到方法或数组中的类的类型,并在以后读取这些对象?,objective-c,arrays,inheritance,restriction,Objective C,Arrays,Inheritance,Restriction,如果有限的对象都是从超类继承的,那么如何限制数组中对象的类型 例如,我有一个父类叫做 parentObj 然后,我有3个子类,这些子类的参数被添加到超类(parentObj)中,但不可用 然后,我有一些其他的类,它们是不相关的,但我想远离我试图构建的数组 otherClass1 otherClass2 我有一个可变数组 NSMutableArray *arrayOfChildren; 我希望主要由parentObj的三个子类组成,而不能包含其他类 我不想为每个子类构建一个不同的方法来读写数

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

例如,我有一个父类叫做

parentObj
然后,我有3个子类,这些子类的参数被添加到超类(parentObj)中,但不可用

然后,我有一些其他的类,它们是不相关的,但我想远离我试图构建的数组

otherClass1
otherClass2
我有一个可变数组

NSMutableArray *arrayOfChildren;
我希望主要由parentObj的三个子类组成,而不能包含其他类

我不想为每个子类构建一个不同的方法来读写数组中的子类,因为我构建的子类可能会更多


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

我处理这个问题的主要方法实际上是由我正在阅读的一本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;
}
//...
等等

您需要记住哪个ID与哪个子类相关,否则肯定会出错

现在假设您有一个for循环,它循环遍历了数组中所有的对象,这些对象都是类。假设我们需要在每个子类中打印出那个额外的参数,我们该怎么做呢?我会告诉你怎么做

让我们假设在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不正确的子类


我希望这能帮助你解决困难,我希望它能帮助你理解为什么继承很重要,为什么你应该使用它

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

- (void)addObject:(id)object
{
    if ([object isKindOfClass:[parentObj class]])
    {
        [self.arrayOfChildren addObject:object];
    }
}
您还可以添加一个
isMemberOfClass
检查是否也要排除
parentObj
类本身的实例。

检查子类对象的“Objective-C-ish”方法是
如果([[array objectAtIndex:x]isKindOfClass:[childClass1 class])…
。对于将来的扩展,它更容易、更安全,并且使父类中的类型标识符过时。
- (void)addObject:(id)object
{
    if ([object isKindOfClass:[parentObj class]])
    {
        [self.arrayOfChildren addObject:object];
    }
}