2012-04-06 3 views
0

All-Une bonne façon de créer des propriétés d'ami

Quelle est la bonne façon de définir les propriétés d'ami en Obj-C (mise en œuvre spécifique est Xcode pour IOS). Par propriétés d'ami, j'entends les attributs d'instance disponibles pour la classe de base, toutes les sous-classes de cette base, mais pas pour le public.

exemple:

@interface Base : NSObject 
@property int friend 
@end 

@interface Sub : Base 
@end 

@implementation Base 
@synthesize friend; 
@end 

@implementation Sub 
-(id)newFriend 
{ 
[self setFriend: [someOtherObject friend]]; // this should be allowed 
} 

@implementation Wow 
-(void) 
{ 
Sub* sub = [[Sub alloc] init]; 
[sub setFriend: [someOtherObject friend]]; // this should not be allowed 
} 

J'ai essayé de mettre l'ami @property pour base dans le fichier .m, mais Sub peut pas le voir. En C++ j'avais un déclarant auxiliaire appelé ami qui a fait exactement ce que je cherchais. Comment faire cela en Obj-C?

Merci

+0

** Jetez un oeil à cet article: ** http://stackoverflow.com/questions/2241488/friend-classes-in-objective-c –

+0

Minor nitpick: en C++, ce que vous décrivez est juste "protégé" ", pas ami". "ami" est nécessaire si l'ami n'est * pas * une sous-classe. Objective-C a @protected, mais c'est juste pour des variables d'instance, pas des méthodes (comme les mentions joerick ci-dessous). Les accesseurs de propriété ne sont que des méthodes. –

Répondre

4

Il n'y a pas moyen de faire respecter ce comportement en Objective-C. Les propriétés ne sont que des méthodes getter et setter sur l'objet Objective-C, et les méthodes peuvent être appelées par n'importe qui.

Une chose que vous pouvez contrôler est la visibilité. La façon dont j'ai émulé les propriétés protégées dans le passé est de déclarer uniquement les propriétés publiques dans Base.h. Créez ensuite un autre fichier d'en-tête appelé Base+protected.h, qui contient une extension de classe avec la propriété déclarée.

// Base.h 

@interface Base : NSObject 

@end 

// Base+protected.h 

#import "Base.h" 

@interface Base() 

@property int friend; 

@end 

// Base.m 

#import "Base.h" 
#import "Base+protected.h" 

@implementation Base 

@synthesize friend; 

@end 

// Sub.h 

#import "Base.h" 

@interface Sub : Base 

@end 

// Sub.m 

#import "Base+protected.h" 

@implementation Sub 

@end 

Ainsi, la mise en œuvre peut voir sous les propriétés protégées, mais une classe externe seulement #include s Base.h ou Sub.h, donc ne peut pas les voir.

Questions connexes