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
}

Base の @property フレンドを .m ファイルに入れようとしましたが、Sub はそれを見ることができません。

C ++には、探しているものを正確に実行するfriendというヘルパー宣言子がありました。Obj-Cでこれを行う方法は?

ありがとう

4

1 に答える 1

4

Objective-C でこの動作を強制する方法はありません。プロパティは、Objective-C オブジェクトの getter メソッドと setter メソッドにすぎず、メソッドは誰でも呼び出すことができます。

コントロールできることの 1 つは、可視性です。私が過去にプロテクト プロパティをエミュレートした方法は、.NET でパブリック プロパティのみを宣言することでしたBase.hBase+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.hまたはのみSub.hであるため、それらを見ることはできません。

于 2012-04-06T15:54:33.377 に答える