Go to the first, previous, next, last section, table of contents.


オブジェクトは単にリファレンスである

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.

検索式: