4

サブクラスで許可されている ivar の型を絞り込むことは可能ですか? このようなもの:

@interface person: NSObject {
  NSArray *friendArray;
}

@interface mutablePerson: person {
  NSMutableArray *friendArray;
}

その正確なコードを試してみたところ、Xcode でコンパイル エラーが発生しました。私はそれを回避する方法があるかどうか疑問に思っています。

私が取り組んでいるプロジェクトでは、このような状況が多く発生します。キャストを使用してコードを機能させることができることを理解しています。しかし、そうすると非常に多くのキャストを作成することになり、より良い方法があるかどうか疑問に思っています.

4

4 に答える 4

1

いいえ、ivar を再宣言することはまったくできません。ただし、新しい ivar を作成しなくても、新しいメソッド ベースのプロパティを作成できます。

@property (nonatomic, copy) NSMutableArray* mutableFriends;

@implementation MutablePerson

- (NSMutableArray*)mutableFriends {
  return (NSMutableArray*)friendArray;
}

- (void)setMutableFriends:(NSMutableArray*)friends {
  self.friendsArray = [friends mutableCopy];
}

@end
于 2010-11-22T17:20:47.623 に答える
0

設定されているオブジェクトが適切な型であることをアサートするためにセッターをオーバーライドし、次のように新しい読み取り専用のゲッターを作成しました。

@interface MutablePerson {
}

@property (readonly) NSMutableArray *mutableFriendArray;

@implementation MutablePerson

-(NSMutableArray *) mutableFriendArray {
  NSMutableArray *ret = (NSMutableArray *)[super friendArray];
  NSAssert ([ret isKindOfClass: [NSMutableArray class]], @"array should be mutable");
  return ret;
}

-(void) setFriendArray: (NSMutableArray *) array {
  NSAssert ([array isKindOfClass: [NSMutableArray class]], @"array should be mutable");
  [super setFriendArray: array];
}
于 2010-11-24T22:16:00.283 に答える
0

@class はまったく意味がありません... @interface である必要があります。したがって、最初のエラーは純粋に構文上のものです。

いいえ、ivar のタイプを変更することはできません。親クラスが別の実装に依存している可能性があるため、(あなたのように) 絞り込むことはできません。それを広げることもうまくいきません(主に同様の理由で.

于 2010-11-22T17:20:07.897 に答える
0

コンパイラが「いいえ」と言った場合、それがあなたの答えです。私はアクセサーを使用します:

//Person
-(NSArray *)friends;


//MutablePerson
-(void)addFriend:(person *)friend;

で、MutablePerson格納する別の配列を宣言するfriendsか、ivar に直接アクセスできますaddFriend:

-(void)addFriend:(person *)friend
{
    _friendsArray = [_friendsArray arrayByAddingObject: friend];
}    

ivar に直接アクセスするのは賢明ではありません。クラスの設計を再考します。person の可変バージョンと不変バージョンを持つ理由は何ですか?

于 2010-11-22T17:20:44.537 に答える