我将@property (strong,nonatomic) NSMutableArray arManagedObjectArray;
放在子类中,其中父类arManagedObjectArray被声明为NSArray。
但是,我可以这样做。
如果我声明@property(强,非原子)NSMutableArray arManagedObjectArray;在父类中,我会收到一条消息,说该属性与声明属性不同?
为什么我可以在子类中执行此操作但不能在父类中执行此操作?
答案 0 :(得分:4)
我把@property(强,非原子)NSMutableArray arManagedObjectArray;在子类中,父类arManagedObjectArray声明为NSArray。
在这里记住您的6年级几何图形。特别回想一下形状的分组。那里有一个公理现在成立:“每个正方形都是一个矩形,但不是每个矩形都是正方形。”如果你认为一个正方形是一个矩形的子类(这是有道理的,因为一个正方形是一个更具体的矩形类型),那么你可以看到该引用的类型理论风味版本背后的推理:“每一个S (ubtype)是T(ype),但不是每个T(ype)都是S(ubtype)。
如果你在这个问题的上下文中考虑,你会得到:“每个NSMutableArray都是一个NSArray,但不是每个NSArray都是一个NSMutableArray。”因此,只要属性的类型等于超类'属性的子类型,就可以重新声明子类中超类的属性。以这种方式,在NSMutableArray上重新声明NSArray总是失败,但是在NSArray上重新声明NSMutableArray总是成功。
答案 1 :(得分:1)
arManagedObjectArray
的 NSMutableArray
,当您在子类中访问arManagedObjectArray
时,您将访问NSMutableArray
并且要访问超类NSArray,您需要编写此
[super arManagedObjectArray];
在超级课程中,您可以访问NSArray
;
修改强>
根据您的问题
由于NSArray具有此名称,因此无法在同一个类中将arManagedObjectArray声明为NSMutableArray。所以这是编译错误,因为当你调用arManagedObjectArray上的任何方法时,编译器会决定你需要哪个数组NSArray或NSMutableArray。