全部 -
在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中做到这一点?
由于
答案 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.h
或Sub.h
的外部类,所以看不到它们。