2012-04-06 13 views
0

All-Richtiger Weg Freund Eigenschaften

Was ist der richtige Weg ist, zu schaffen Freund Eigenschaften in Obj-C (spezifische Implementierung ist Xcode für IOS) zu definieren. Mit Freundeseigenschaften meine ich Instanzattribute, die für die Basisklasse, für alle Unterklassen dieser Basis, aber nicht für die Öffentlichkeit verfügbar sind.

Beispiel:

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

Ich habe versucht, den @property Freund für Base in der .m-Datei setzen, aber dann kann Sub es nicht sehen.

In C++ hatte ich einen Helfer Deklarator namens Freund, der genau das tat, was ich suche. Wie macht man das in Obj-C?

Dank

+0

** Schauen Sie sich diesen Beitrag an: ** http://stackoverflow.com/questions/2241488/friend-classes-in-objective-c –

+0

Minor Nitpick: in C++, was Sie beschreiben, ist nur "geschützt ", kein Freund". "Freund" ist notwendig, wenn der Freund * keine * Unterklasse ist. Objective-C ist @protected, aber es sind nur Variablen, keine Methoden (wie Joerick unten erwähnt). Eigenschaftenaccessoren sind nur Methoden. –

Antwort

4

Es gibt keine Möglichkeit, dieses Verhalten in Objective-C zu erzwingen. Eigenschaften sind nur Getter- und Setter-Methoden für das Objective-C-Objekt, und Methoden können von jedem aufgerufen werden.

Eine Sache, die Sie steuern können, ist die Sichtbarkeit. Die Art, wie ich geschützte Eigenschaften in der Vergangenheit emuliert habe, besteht darin, nur öffentliche Eigenschaften in Base.h zu deklarieren. Erstellen Sie dann eine andere Header-Datei mit Name Base+protected.h, die eine Klassenerweiterung mit der deklarierten Eigenschaft enthält.

// 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 

So ist die Sub-Implementierung kann die geschützten Eigenschaften, aber jede externe Klasse sehen nur #include s Base.h oder Sub.h, so sie nicht sehen können.

Verwandte Themen