-1

@property (strong,nonatomic) NSMutableArray arManagedObjectArray;親クラスで arManagedObjectArray が NSArray として宣言されているサブクラスを作成しました。

しかし、私はそれを行うことができます。

@property (strong,nonatomic) NSMutableArray arManagedObjectArray; を宣言すると、代わりに親クラスで、プロパティが宣言と同じタイプではないというメッセージが表示されますか?

サブクラスではできるのに、親クラスではできないのはなぜですか?

4

2 に答える 2

4

私は @property (strong,nonatomic) NSMutableArray arManagedObjectArray; を入れました。サブクラスで、親クラス arManagedObjectArray が NSArray として宣言されています。

ここで、6 年生の幾何学を少し思い出してください。特に、形状のグループ化を思い出してください。現在でも当てはまる公理があります。「すべての正方形は長方形ですが、すべての長方形が正方形であるとは限りません。」正方形を長方形のサブクラスと見なす場合 (正方形は長方形のより具体的なタイプであるため、これは理にかなっています)、その引用のタイプ理論風味のバージョンの背後にある理由がわかります。 (ubtype) は T(ype) ですが、すべての T(ype) が S(ubtype) であるとは限りません。

この質問の文脈で考えると、「すべての NSMutableArray は NSArray ですが、すべての NSArray が NSMutableArray であるとは限りません。」したがって、プロパティの型がスーパークラスのプロパティと等しいか、そのサブタイプである限り、サブクラスでスーパークラスのプロパティを再宣言できます。このように、NSMutableArray に対する NSArray の再宣言は常に失敗しますが、NSArray に対する NSMutableArray の再宣言は常に成功します。

于 2013-06-10T09:04:36.117 に答える
1

arManagedObjectArrayNSMutableArrayサブクラスでアクセスすると、サブクラスで宣言されarManagedObjectArray、サブクラスでアクセスすると、NSMutableArray

スーパークラス NSArray にアクセスするには、これを記述する必要があります

[super arManagedObjectArray];

スーパークラスではアクセスできますNSArray

編集

:

ご質問の通り

NSArray にこの名前があるため、同じクラスで arManagedObjectArray を NSMutableArray として宣言することはできません。したがって、arManagedObjectArray でメソッドを呼び出すと、コンパイラは NSArray または NSMutableArray が必要な配列を決定するため、コンパイル エラーになります。

于 2013-06-10T07:54:15.433 に答える