クラスを更に考える (2/8)
作成:2011-02-08 11:30
更新:2011-11-13 16:04
更新:2011-11-13 16:04
■コンビニエンスコンストラクタを作る
コンビニエンスコンストラクタというのは、わかりやすくいえば「インスタンスを作って返すためのメソッド」です。先のサンプルからもわかるように、インスタンスの作成というのは意外に面倒なものです。allocしてinitしてautoreleaseして、それから必要なインスタンス変数に値を設定して……。そうしたことをまとめて行ってくれ、準備完了したインスタンスを返してくれる、それがコンビニエンスコンストラクタです。
では、実際に作ってみましょう。下にMyTestClassにメソッドを追加したサンプルを掲載しておきました。ここでは、こんな形でクラスメソッドを定義してあります。
ここでは、[self alloc]というようにしてインスタンスを生成していますね。この「self」というのは「自分自身」を示すキーワードです。クラスメソッド内であればそのクラス自身を示しますし、インスタンスメソッド内であればそのインスタンス自身を示します。
似たようなものに「super」というものもあります。これは、スーパークラスを示すキーワードです。例えば、[super abc]なんてやれば、スーパークラスのabcメソッドを呼び出せる、というわけですね。この「self」と「super」はセットで覚えておくとよいでしょう。
こうしてコンビニエンスコンストラクタを用意すると、インスタンス作成が劇的に簡単になります。main関数での利用例を見てください。わずか1行でインスタンスが作成されています。またコンビニエンスコンストラクタを利用することにより、例えば「allocしたけどinitし忘れた」といった単純なミスも防ぐことができます。確実に、きちんとした形でインスタンスを作成するのにコンビニエンスコンストラクタは重要な役割を果たしているのです。
では、実際に作ってみましょう。下にMyTestClassにメソッドを追加したサンプルを掲載しておきました。ここでは、こんな形でクラスメソッドを定義してあります。
+(MyTestClass*)myTestClassWithMessage:(NSString*)str;クラスメソッドですから、最初は「+」で始まります。そして引数としてNSStringを渡すようにしてあります。インスタンスを作成し、これをmessageインスタンス変数に設定したものを返すようにしよう、というわけです。
ここでは、[self alloc]というようにしてインスタンスを生成していますね。この「self」というのは「自分自身」を示すキーワードです。クラスメソッド内であればそのクラス自身を示しますし、インスタンスメソッド内であればそのインスタンス自身を示します。
似たようなものに「super」というものもあります。これは、スーパークラスを示すキーワードです。例えば、[super abc]なんてやれば、スーパークラスのabcメソッドを呼び出せる、というわけですね。この「self」と「super」はセットで覚えておくとよいでしょう。
こうしてコンビニエンスコンストラクタを用意すると、インスタンス作成が劇的に簡単になります。main関数での利用例を見てください。わずか1行でインスタンスが作成されています。またコンビニエンスコンストラクタを利用することにより、例えば「allocしたけどinitし忘れた」といった単純なミスも防ぐことができます。確実に、きちんとした形でインスタンスを作成するのにコンビニエンスコンストラクタは重要な役割を果たしているのです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※MyTestClass.hの内容 #import <Foundation/Foundation.h> @interface MyTestClass : NSObject { NSString* message; } +(MyTestClass*)myTestClassWithMessage:(NSString*)str; -(void)setMessage:(NSString*) str; -(NSString*)message; -(void)printMessage; @end ※MyTestClass.mの内容 #import "MyTestClass.h" @implementation MyTestClass +(MyTestClass*)myTestClassWithMessage:(NSString*)str { MyTestClass* obj = [[self alloc] init]; [obj setMessage:str]; return obj; } -(void)setMessage:(NSString*) str { message = str; } -(NSString*)message { return message; } -(void)printMessage { NSLog(@"%@",message); } @end ※main.mの内容 #import <Foundation/Foundation.h> #import "MyTestClass.h" int main (int argc, const char * argv[]) { id obj = [MyTestClass myTestClassWithMessage:@"This is First Object!!"]; [obj printMessage]; return 0; }
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る