パッケージとクラスのコンテキストの問題を解決するために、オブジェクトを使 います。メソッドが必要とするものはすべて、オブジェクトを通じて利用するか、 メソッドへの引数として渡すようにしなければなりません。
クラスには、メソッドが使用する静的なデータやグローバルなデータを用意する ことがあります。サブクラスで、このデータを新しいデータでオーバライドした いこともあるでしょう。このようなときに、サブクラスでは新しいデータを探す 方法を知ることができません。
この問題は、メソッドのコンテキストを定義するために、オブジェクトを使うこ とで解決することができます。データへのリファレンスを探すために、メソッド にオブジェクトを覗かせます。別解として、メソッドに追いかけさせ (「これは、 私のクラスのものか、それともサブクラスのものなのか。いったい、どのサブク ラスのものか。」)るものですが、不便で、遺物のようなものにしかならないで しょう。メソッドに対して、オブジェクトにデータがどこにあるのかを言わせれ ばよいでしょう。
package Bar; %fizzle = ( 'Password' => 'XYZZY' ); sub new { my $self = {}; $self->{'fizzle'} = \%fizzle; bless $self; } sub enter { my $self = shift; # %Bar::fizzle を使うべきか、%Foo::fizzle を # 使うべきかを考えてはいけません。オブジェ # クトの方でもう分かっていますから、単に尋く # だけです。 # my $fizzle = $self->{'fizzle'}; print "The word is ", $fizzle->{'Password'}, "\n"; } package Foo; @ISA = qw( Bar ); %fizzle = ( 'Password' => 'Rumple' ); sub new { my $self = Bar->new; $self->{'fizzle'} = \%fizzle; bless $self; } package main; $a = Bar->new; $b = Foo->new; $a->enter; $b->enter;
Go to the first, previous, next, last section, table of contents.