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


コード再利用の考慮

オブジェクト指向言語の 1 つの強みは、古いコードが新しいコードを使うこと が簡単にできるということです。次の例では、まずどのようなことがコードの再 利用を妨げるかを示して、それから、どのように再利用を推し進めるかを示しま す。

最初の例は、「プライベートな」メソッド BAZ() をアクセスするために、 メソッドを呼び出すのにパッケージ名をすべて付けているクラスを示します。次 の例で、この BAZ() をオーバライドすることができないことを示します。

package FOO;

sub new { bless {} }
sub bar {
        my $self = shift;
        $self->FOO::private::BAZ;
}

package FOO::private;

sub BAZ {
        print "in BAZ\n";
}

package main;

$a = FOO->new;
$a->bar;

さて、BAZ() をオーバライドしてみましょう。FOO::bar()GOOP::BAZ() を呼ぶようにしたいのですが、FOO::bar() では、 明示的に FOO::private::BAZ() を呼んでいるため、これができません。

package FOO;

sub new { bless {} }
sub bar {
        my $self = shift;
        $self->FOO::private::BAZ;
}

package FOO::private;

sub BAZ {
        print "in BAZ\n";
}

package GOOP;
@ISA = qw( FOO );
sub new { bless {} }

sub BAZ {
        print "in GOOP::BAZ\n";
}

package main;

$a = GOOP->new;
$a->bar;

再利用可能なコードを作るためには、クラス FOO::private の階層をな くして、クラス FOO を修正しなければなりません。次の例で、メソッド FOO::BAZ() の代わりに GOOP::BAZ() を呼べるようにする再利用 可能なクラス FOO を示します。

package FOO;

sub new { bless {} }
sub bar {
        my $self = shift;
        $self->BAZ;
}

sub BAZ {
        print "in BAZ\n";
}

package GOOP;
@ISA = qw( FOO );

sub new { bless {} }
sub BAZ {
        print "in GOOP::BAZ\n";
}

package main;

$a = GOOP->new;
$a->bar;


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

検索式: