正确的方法来创建朋友属性

时间:2012-04-06 15:43:13

标签: objective-c ios xcode

全部 -

在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朋友的Base放在.m文件中,但是Sub看不到它。

在c ++中,我有一个名为friend的帮助器声明器,它正是我正在寻找的。如何在Obj-C中做到这一点?

由于

1 个答案:

答案 0 :(得分: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

所以Sub实现可以看到受保护的属性,但是只有#include s Base.hSub.h的外部类,所以看不到它们。