Objective C – 子类中的狭义实例variablestypes?

是否有可能在一个子类中缩小伊娃的允许types。 像这样的东西:

@interface person: NSObject { NSArray *friendArray; } @interface mutablePerson: person { NSMutableArray *friendArray; } 

我只是试着确切的代码,和Xcode给了我一个编译错误。 我想知道是否有解决办法。

我正在做的这个项目将会有很多这样的情况。 我明白,我可以使用强制使代码工作。 但是如果我这样做的话,我会做很多的演员,而且我想知道是否有更好的方法。

不,你根本不能重新宣布伊娃。 不过,你可以制作一个新的方法为基础的财产,而不是一个新的伊娃。

 @property (nonatomic, copy) NSMutableArray* mutableFriends; @implementation MutablePerson - (NSMutableArray*)mutableFriends { return (NSMutableArray*)friendArray; } - (void)setMutableFriends:(NSMutableArray*)friends { self.friendsArray = [friends mutableCopy]; } @end 

@class没有任何意义…它应该是@interface。 所以第一个错误是纯粹的语法。

不,你不能改变伊娃的types。 这是一个很好的理由:缩小(如你所做的)是行不通的,因为父类可能依赖于不同的实现。 扩大它不能工作(主要是出于类似的原因。

如果编译器说“不”,那么这就是你的答案。 我会使用访问器:

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

MutablePerson您可以声明另一个数组来存储friends或者您可以直接在addFriend:访问该ivar:

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

直接访问ivars并不聪明。 我会重新考虑你的class级devise。 有一个可变的,不可变的人的理由是什么?

我结束了重写setter来声明被设置的对象是合适的types,并创build一个新的只读getter,如下所示:

 @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]; }