パッケージとクラスのコンテキストの問題を解決するために、オブジェクトを使 います。メソッドが必要とするものはすべて、オブジェクトを通じて利用するか、 メソッドへの引数として渡すようにしなければなりません。
クラスには、メソッドが使用する静的なデータやグローバルなデータを用意する ことがあります。サブクラスで、このデータを新しいデータでオーバライドした いこともあるでしょう。このようなときに、サブクラスでは新しいデータを探す 方法を知ることができません。
この問題は、メソッドのコンテキストを定義するために、オブジェクトを使うこ とで解決することができます。データへのリファレンスを探すために、メソッド にオブジェクトを覗かせます。別解として、メソッドに追いかけさせ (「これは、 私のクラスのものか、それともサブクラスのものなのか。いったい、どのサブク ラスのものか。」)るものですが、不便で、遺物のようなものにしかならないで しょう。メソッドに対して、オブジェクトにデータがどこにあるのかを言わせれ ばよいでしょう。
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.