オブジェクト指向言語の 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.