Objective-Cベース8:クラス拡張(class extension)
1716 ワード
パッケージの特性は、共通インタフェースを露出して外部に呼び出すことであり、C++はpublicによって共通メソッドを定義して外部に呼び出すことであり、protectedとprivateによって定義されたメソッドはクラスでしか使用できず、外部に呼び出すことはできません.外部に呼び出すと、コンパイラは直接エラーを報告し、変数についても同じです.OCのクラス拡張はprotectedやprivateのような役割を果たしています.
1.クラス拡張は特殊なカテゴリであり、定義時に名前を付ける必要はありません.次のコードはクラスThingsの拡張を定義します.
@interface Things ()
{
NSInteger thing4;
}
@end
2.クラス拡張機能
1)外部に露出した可読属性を読み書き容易クラス内部修正に変更できる.
はい.hファイルにはthing 2が読み取り専用属性であることが宣言されており、thing 2の値を変更することはできません.
はい.mの中のresetAllValuesの方法の実現の中でthing 2を300に変えることができる.
2)プライベートインスタンス変数を追加できます.例えば、上記の例Things拡張はNSInteger thing 4を追加した.このインスタンス変数はThings内部でのみアクセスでき,外部ではアクセスできないためプライベートである.
3)プライベート属性は任意に追加できます.Things拡張で@property(assign)NSInteger thing 3を追加できます.
4)プライベートメソッドを追加できます.次のコードはThings拡張でメソッドdisInfoメソッドを宣言し、Thingsで実装し、resetAllValuesでdisInfoを呼び出した.
1.クラス拡張は特殊なカテゴリであり、定義時に名前を付ける必要はありません.次のコードはクラスThingsの拡張を定義します.
@interface Things ()
{
NSInteger thing4;
}
@end
2.クラス拡張機能
1)外部に露出した可読属性を読み書き容易クラス内部修正に変更できる.
はい.hファイルにはthing 2が読み取り専用属性であることが宣言されており、thing 2の値を変更することはできません.
@interface Things : NSObject
@property (readonly, assign) NSInteger thing2;
- (void)resetAllValues;
@end
はい.mの中のresetAllValuesの方法の実現の中でthing 2を300に変えることができる.
@interface Things ()
{
NSInteger thing4;
}
@property (readwrite, assign) NSInteger thing2;
@end
@implementation Things
@synthesize thing2;
- (void)resetAllValues
{
self.thing2 = 300;
thing4 = 5;
}
2)プライベートインスタンス変数を追加できます.例えば、上記の例Things拡張はNSInteger thing 4を追加した.このインスタンス変数はThings内部でのみアクセスでき,外部ではアクセスできないためプライベートである.
3)プライベート属性は任意に追加できます.Things拡張で@property(assign)NSInteger thing 3を追加できます.
4)プライベートメソッドを追加できます.次のコードはThings拡張でメソッドdisInfoメソッドを宣言し、Thingsで実装し、resetAllValuesでdisInfoを呼び出した.
@interface Things ()
{
NSInteger thing4;
}
@property (readwrite, assign) NSInteger thing2;
@property (assign) NSInteger thing3;
- (void) disInfo;
@end
@implementation Things
@synthesize thing2;
@synthesize thing3;
- (void) disInfo
{
NSLog(@"disInfo");
}
- (void)resetAllValues
{
[self disInfo];
self.thing1 = 200;
self.thing2 = 300;
self.thing3 = 400;
thing4 = 5;
}