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