//Person class. @interface Person : NSObject { } - (id) init; - (void) sayName; - (void) whatYourName; @end @implementation Person - (id) init { return [super init]; } //お名前メソッド。Personクラスでは無名ということで、名前は分かりません。 - (void) sayName { printf("自分の名前分かりませーん。\n"); } - (void) whatYourName { [self sayName]; } @end //佐藤さんクラス(仮称) @interface Sato : Person { } - (id) init; - (void) sayName; @end; @implementation Sato - (id) init { return [super init]; } //お名前メソッド - (void) sayName { printf("私は佐藤です。\n"); } @end //加藤さんクラス(仮称) @interface Kato : Person { } - (id) init; - (void) sayName; @end @implementation Kato - (id) init { return [super init]; } //お名前メソッド - (void) sayName { printf("私は加藤です。\n"); } @end //main int main(void) { id pool = [[NSAutoreleasePool alloc] init]; //佐藤さんインスタンス、Person型で定義していることに注意。 Person *sato = [[[Sato alloc] init] autorelease]; //加藤さんインスタンス、Person型で定義していることに注意。 Perpson *kato = [[[Kato alloc] init] autorelease]; //普通にメソッドを呼び出し [sato sayName]; [kato sayName]; //親クラスのメソッド呼び出し、サブクラスのメソッドが呼び出される [sato whatYourName]; [kato whatYourName]; [pool release]; return 0; }
実行結果
私は佐藤です。
私は加藤です。
私は佐藤です。
私は加藤です。
私は加藤です。
私は佐藤です。
私は加藤です。
メイン関数内の
//普通にメソッドを呼び出し [sato sayName]; [kato sayName];
では、親クラスの型に対して、親クラスのメソッドsyaNameが呼び出されるわけではなく、それぞれサブクラスのメソッドが正しく呼び出されています。
//親クラスのメソッド呼び出し、サブクラスのメソッドが呼び出される [sato whatYourName]; [kato whatYourName];
では、親クラスにのみ定義されているwhatYourNameメソッドを呼び出し、そのメソッド内からサブクラスの呼び出しが正しく行われています。Java/C++のように言語上のサポートはありませんが、抽象クラスとしては同様の事が可能なようです。
0 件のコメント :
コメントを投稿