为什么我可以重新声明子类中的属性?

时间:2013-06-10 07:28:41

标签: objective-c

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

但是,我可以这样做。

如果我声明@property(强,非原子)NSMutableArray arManagedObjectArray;在父类中,我会收到一条消息,说该属性与声明属性不同?

为什么我可以在子类中执行此操作但不能在父类中执行此操作?

2 个答案:

答案 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)

在subcalss中声明为arManagedObjectArray

NSMutableArray,当您在子类中访问arManagedObjectArray时,您将访问NSMutableArray

并且要访问超类NSArray,您需要编写此

[super arManagedObjectArray];

在超级课程中,您可以访问NSArray;

修改

根据您的问题

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