感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Objective-Cで継承を使ってみるサンプル。

<スポンサーリンク>

構文

継承を利用すると、親クラスの機能をすべて備えたクラスを定義することができる。
親クラスはスーパークラスと呼ばれ、オブジェクト指向において、継承はクラスが別のクラスの機能を取得することを意味する。

Objective-Cの継承の構文は以下の通り。

@interface Circle : NSObject

こんな感じで、コロン(:)のあとに指定されている識別子が継承元のクラスである。
C++では多重継承と呼ばれる機能をサポートしていて、クラスに複数のクラスを継承させることができるが、Objective-Cでは多重継承をサポートしていない。

なお、オーバーライドとは、継承したメソッドの実装を変更する必要がある場合に、同じメソッド名で処理を書き換えることを言う。

仕組み

オブジェクトがメッセージを受け取ったとき、まずは現在のクラスで実行するメソッドを探す。
メッセージを受け取ったオブジェクトのクラスでメソッドが見つからない場合、ディスパッチャはそのオブジェクトのスーパークラスを調べる。
「ここでは見つからないのでスーパークラスを調べる」というアクションは必要に応じて、継承チェーンのすべてのクラスで繰り返される。
最後のスーパークラスであるNSObjectでもメソッドが見つからない場合は、ランタイムエラーとなる。

サンプル

ここまで仕組みを見たところで、実際にサンプルを作ってみる。
昨日勉強したときに作ったクラスを継承して、新しいクラスを作ってみる。

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @private
    NSString *_name;
    NSString *_message;
}

- (void) setName: (NSString*)name;
- (void) setMessage: (NSString*)message;
- (void) sayMessage;
- (NSString*) getName;
- (NSString*) getMessage;
@end

//Personを継承している
@interface Sho322 : Person{}
- (void) callMyName;
@end

@implementation Person

- (void) setName: (NSString*)name {
    _name = name;
}

- (void) setMessage: (NSString*)message {
    _message = message;
}

- (void) sayMessage {
    NSLog(@"メッセージは:%@",_message);
}

- (NSString*) getMessage {
    return _message;
}

- (NSString*) getName {
    return _name;
}
@end

@implementation Sho322

- (void) callMyName {
    NSLog(@"I am sho322!");
}
@end

int main (int argc, const char * argv[])
{

    Sho322 *sho322 = [Sho322 new];
    
    [sho322 setName: @"sho322"];
    [sho322 setMessage: @"hello, Objective-C"];
     
    [sho322 sayMessage];
    
    NSLog(@"セットされたメッセージは:%@", [sho322 getMessage]);
    NSLog(@"セットされた名前は:%@", [sho322 getName]);
    NSLog(@"上記の継承したメソッドに加えて、自分のメソッド実行した結果:");
    [sho322 callMyName];

    return 0;
}

Personを継承したクラスを実行すると、たしかに親クラスのメソッドも使えるし、自分のメソッドも使えている。
結果はこちら。

2013-10-24 23:27:07.198 mytest[351:903] メッセージは:hello, Objective-C
2013-10-24 23:27:07.202 mytest[351:903] セットされたメッセージは:hello, Objective-C
2013-10-24 23:27:07.203 mytest[351:903] セットされた名前は:sho322
2013-10-24 23:27:07.203 mytest[351:903] 上記の継承したメソッドに加えて、自分のメソッド実行した結果:
2013-10-24 23:27:07.205 mytest[351:903] I am sho322!

今日勉強した本

入門Objective-C 2.0 [第2版] (Programmer’s SELECTION)

入門Objective-C 2.0 [第2版] (Programmer’s SELECTION)

Objective-Cの基礎から詳しく解説してくれる。
「超入門」の本と一緒に読むことで、理解が深まる。

感謝のプログラミング

今回で感謝のプログラミングは【679時間目】
10000時間まで、あと【9321時間】