-1

我放入@property (strong,nonatomic) NSMutableArray arManagedObjectArray;了子类,其中父类 arManagedObjectArray 被声明为 NSArray。

不过,我可以做到。

如果我声明 @property (strong,nonatomic) NSMutableArray arManagedObjectArray; 相反,在父类中,我会收到一条消息,说该属性与声明的类型不同?

为什么我可以在子类中做到,但不能在父类中做到?

4

2 回答 2

4

我把@property (strong,nonatomic) NSMutableArray arManagedObjectArray; 在子类中,父类 arManagedObjectArray 被声明为 NSArray。

在这里记住你六年级的几何图形。回想一下,特别是对形状的分组。有一个公理现在成立:“每个正方形都是矩形,但不是每个矩形都是正方形。” 如果您认为正方形是矩形的子类(这是有道理的,因为正方形是矩形的更具体类型),那么您可以看到该引用的类型理论风味版本背后的推理:“每个 S (ubtype) 是 T(ype),但并非每个 T(ype) 都是 S(ubtype)。

如果您在这个问题的上下文中考虑,您会得到:“每个 NSMutableArray 都是 NSArray,但并非每个 NSArray 都是 NSMutableArray。” 因此,您可以在子类中重新声明超类的属性,只要该属性的类型等同于超类的属性或其子类型。这样,在 NSMutableArray 上重新声明 NSArray 总是失败,但在 NSArray 上重新声明 NSMutableArray 总是成功。

于 2013-06-10T09:04:36.117 回答
1

arManagedObjectArray声明为NSMutableArray在子类中,当您arManagedObjectArray访问子类时,您将访问一个NSMutableArray

并且为了访问超类 NSArray 你需要写这个

[super arManagedObjectArray];

在超级类中,您可以访问NSArray

编辑

根据你的问题

你不能在同一个类中将 arManagedObjectArray 声明为 NSMutableArray,因为你有这个 NSArray 的名称。所以这是编译错误,因为当您在 arManagedObjectArray 上调用任何方法时,编译器将如何决定您需要 NSArray 或 NSMutableArray 哪个数组。

于 2013-06-10T07:54:15.433 回答