#import <Foundation/Foundation.h>
@interface NSObject (MyTest)
- (id) methodA;
@end
@implementation NSObject (MyTest)
- (id)methodA
{
NSLog(@"NSObject");
}
@end
@interface TestA:NSObject
- (id) methodA;
- (id) methodB;
- (id) methodC;
@end
@implementation TestA
- (id) methodA
{
NSLog(@"class A");
}
- (id) methodB
{
[self methodA];
}
- (id) methodC
{
[super methodA];
}
@end
@interface TestB : TestA
- (id) methodA;
@end
@implementation TestB
- (id) methodA
{
NSLog(@"class B");
}
@end
int main(void){
SAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
TestB *objB = [[TestB alloc] init ];
//selfの確認
[objB methodB];
//superの確認
[objB methodC];
return 0;
}
実行結果
2010-07-16 06:55:59.383 a.out[512:903] class B
2010-07-16 06:55:59.385 a.out[512:903] NSObject
カテゴリを用いたことで,NSObjectにmethodAを実装することができました.
Objective-Cのカテゴリはメソッドの整理だけではなく,既存クラスにmethodを追加することができます.これは非常に便利ですが,やはり既存クラスに追加するのは,できる限りさけたいものです.
カテゴリで注意しなければならないのは,インスタンス変数を付加できないということ,そして,既存のクラスのメソッドと同じ名前でメソッドを定義すると,上書きができてしまうことです.これはメリットでもありデメリットでもあります.上書きした場合,元のメソッドは呼び出すことはできません.
0 件のコメント:
コメントを投稿