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


クラスコンテキストとオブジェクト

パッケージとクラスのコンテキストの問題を解決するために、オブジェクトを使 います。メソッドが必要とするものはすべて、オブジェクトを通じて利用するか、 メソッドへの引数として渡すようにしなければなりません。

クラスには、メソッドが使用する静的なデータやグローバルなデータを用意する ことがあります。サブクラスで、このデータを新しいデータでオーバライドした いこともあるでしょう。このようなときに、サブクラスでは新しいデータを探す 方法を知ることができません。

この問題は、メソッドのコンテキストを定義するために、オブジェクトを使うこ とで解決することができます。データへのリファレンスを探すために、メソッド にオブジェクトを覗かせます。別解として、メソッドに追いかけさせ (「これは、 私のクラスのものか、それともサブクラスのものなのか。いったい、どのサブク ラスのものか。」)るものですが、不便で、遺物のようなものにしかならないで しょう。メソッドに対して、オブジェクトにデータがどこにあるのかを言わせれ ばよいでしょう。

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.

検索式: