【Objective-C】protectedなproperty
protectedなpropertyの実現の仕方を現場のエレガントなコードを書く方に教えていただきました。
カテゴリーを利用すると実現できるんですね。
まず親クラス。
SuperHoge.m
#import <Foundation/Foundation.h> @interface SuperHoge : NSObject @end
SuperHoge.m
#import "SuperHoge.h" @interface SuperHoge () /** protectedにしたいプロパティ */ @property NSString *protectedProp; @end @implementation SuperHoge @end
クラス拡張にてプロパティを定義するのがポイント。
んで、親クラスのカテゴリ
SuperHoge+Private.h
#import "SuperHoge.h" @interface SuperHoge (Private) /** protectedにしたいプロパティ */ @property NSString *protectedProp; @end
SuperHogeのクラス拡張にて定義したプロパティと同じものを定義するのがポイント。
カテゴリに関しては実装することがないので、実装ファイルはなくていいです。
次に子クラス
SubHoge.h
#import "SuperHoge+Private.h" @interface SubHoge : SuperHoge @end
子クラスでは親クラスのカテゴリをインポートする。
イニシャライザーでprotectedPropにアクセスしてみる。
SubHoge.m
#import "SubHoge.h" @implementation SubHoge - (id)init { if (self = [super init]) { // _protectedProp = @"init Hogehoge" のようにインスタンス変数に直接アクセスはできない。 self.protectedProp = @"init Hogehoge"; NSLog(@"%@", self.protectedProp); } return self; } @end
他クラスからの利用
#import "SubHoge.h" /*-------------------中略----------------------------------*/ SubHoge *hoge = [[SubHoge alloc] init]; hoge.protectedProp = @"update protectedProp"; NSLog(@"%@", hoge.protectedProp);
ログ出力
init protectedProp update protectedProp