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



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

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

parentObj

然后,我有3个子类,它们有添加的参数,但对超类(parentObj)不可用

childClass1
childClass2
childClass3

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

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

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

最新更新