コンストラクタの作成
前回は以下のようなクラスの雛形を作成しました。
package Book; sub new { # コンストラクタの実装 } sub title { # アクセッサの実装 } sub author { # アクセッサの実装 }
1. コンストラクタとは
オブジェクトはクラスを元に生成されます。オブジェクトとは何かとかクラスとは何かということは少し忘れて、「オブジェクトはクラスを元に生成される」ということを覚えてください。
そしてコンストラクタとはオブジェクトを生成するメソッドのことです。コンストラクタを作成すれば
my $book = Book->new;
という記述でオブジェクトを作成できるようになります。
コンストラクタ名には慣習的にnewという名前が使用されます。ですが、コンストラクタはnewという名前に必ずしましょう(なぜならあなたのモジュールを使う人はコンストラクタ名がnewであることを期待するからです)
2. 一番簡単なコンストラクタの実装
ではコンストラクタを実装してみましょう。以下が一番簡単なコンストラクタの実装になります。でも一番簡単といっても少し難しいのです。
sub new { my $class = shift; my $self = {}; return bless $self, $class; }
以下の呼び出し
my $book = Book->new;
を行ったとき、 $class には、何が代入されるでしょうか?
答えは、Book です。コンストラクタnewは第1引数としてクラス名を受け取ります。
3. ハッシュのリファレンスを準備する
my $self = {};
の行は何をしているのでしょうか?
実はこれはオブジェクトが所有するデータなのです。重要なのでもう一度いいます。オブジェクトはデータを所有します。そして、一般的には、ハッシュのリファレンスがデータとして選択されます。
(本当に本当のことをいえば、オブジェクトはデータそのものです。ややこしくならないために最初はオブジェクトはデータを所有すると覚えてください。)
4. データとクラスを結びつける
最後の行
return bless $self, $class;
には、bless という関数があります。
bless関数は、第1引数にデータ、第2引数にクラス名を受け取って、データとクラスを結び付けます。
オブジェクトは、データとクラスを結びつけて生み出されるのです。そして、結びつけたものを呼び出しもとに返却してあげます。