创建好友属性的正确方法



All-

在 Obj-C 中定义友元属性的正确方法是什么(具体实现是 Xcode for IOS)。通过友元属性,我指的是可用于基类、该基的任何子类但对公众不可用的实例属性。

例:

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

我尝试将 Base 的@property朋友放在 .m 文件中,但随后 Sub 看不到它。

在 c++ 中,我有一个名为 friend 的帮助声明器,它完全符合我的需求。 如何在 Obj-C 中执行此操作?

谢谢

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 Base.hSub.h,所以看不到它们。

最新更新