2012-04-06 17 views
0

清一色正確的方法來創建朋友性質

什麼是定義的OBJ-C(具體的實現是IOS的Xcode)朋友性質的正確方法。通過朋友屬性,我的意思是可用於基類的實例屬性,該基類的任何子類,但不公開。

例如:

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

我試圖把@property的朋友基地.m文件,但後來子還看不出來。

在C++中,我有一個名爲friend的助手聲明器,它完全符合我的要求。如何在Obj-C中做到這一點?

感謝

+0

**看看這篇文章:** http://stackoverflow.com/questions/2241488/friend-classes-in-objective-c – 2012-04-06 15:45:36

+0

Minor nitpick:在C++中,你所描述的只是「受保護的「,而不是」朋友「。如果朋友是*不是子類,則「朋友」是必要的。 Objective-C具有@protected,但它僅用於實例變量,而不是方法(如下面的joerick所述)。屬性訪問器只是方法。 – 2012-04-07 06:57:45

回答

4

有沒有辦法強制執行Objective-C的這種行爲。屬性只是Objective-C對象上的getter和setter方法,任何人都可以調用方法。

你可以控制的一件事是可視性。我過去模擬保護屬性的方式是僅聲明Base.h中的公共屬性。然後創建另一個名爲Base+protected.h的頭文件,其中包含具有聲明屬性的類擴展。

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

所以分實現可以看到被保護的屬性,但任何外部類只#include小號Base.hSub.h,所以看不到他們。