C++ とは違って、Perl ではコンストラクタのために、特別な構文を用意してい
ません。コンストラクタは単に、あるクラス内に bless
されたリファレ
ンスを返すサブルーティンで、一般にそのクラスは、該当サブルーティンが定義
されているクラスです。典型的なクラスの例を示します:
package Critter; sub new { bless {} }
{
} は、key/value ペアを 1 つも含まず、名前の無いハッシュへのリファ
レンスを作ります。bless()
がそのリファレンスを受け取って、そのリ
ファレンスが参照するオブジェクトに対し、現在のパッケージが
`Critter' であることを告げ、そのリファレンスを返します。これは、参
照されたオブジェクト自身が bless
されたことを知っているため、簡単
にしたもので、以下のようにそのリファレンスを直接返することができあます:
sub new { my $self = {}; bless $self; return $self; }
実際には、コンストラクタによる構築の一部として、クラス内のメソッドを呼ぶ ような、より込み入ったコンストラクタで、このような構成を目にすることが多 くなります。
sub new { my $self = {} bless $self; $self->initialize(); $self; }
クラスパッケージ内では、メソッドは、そのリファレンスを通常のリファレンス として扱います。クラスパッケージの外では、そのリファレンスは一般に、その クラスのメソッドを通してのみアクセスできる、直接参照できない値として扱わ れます。
コンストラクタは、その時点で別のクラスに属していて参照されているオブジェ
クトを、再度 bless
することができますが、その場合には、新しいクラ
スが、最後の後片付けに全責任を持ちます。以前に行なわれた bless
は
忘れ去られ、オブジェクトは、その時点では、1 つのクラスにしか属することが
できません。(ですが、もちろん多くのクラスからメソッドを継承することは、
自由です。)
明確化事項: Perl オブジェクトは、bless
されます。単なるリファレン
スは、されません。オブジェクトは、自分が属しているパッケージがどれである
かを知っています。リファレンスは、知りません。bless()
関数は、オ
ブジェクトを探すために、単にリファレンスを用います。以下の例を見てみましょ
う:
$a = {}; $b = $a; bless $a, BLAH; print "\$b is a ", ref($b), "\n";
このプログラムは、$b
が `BLAH' であると報告してくれます。つ
まり、明らかに bless()
は、オブジェクトに対して働くのであって、リ
ファレンスに働くものではありません。
Go to the first, previous, next, last section, table of contents.