0

全部-

在 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 中做到这一点?

谢谢

4

1 回答 1

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 实现可以看到受保护的属性,但任何外部类只有#includesBase.hSub.h,所以看不到它们。

于 2012-04-06T15:54:33.377 回答