#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 件のコメント:
コメントを投稿