parentを使ってクラスの継承をしてみる

いまいち良く分かってないので、
とりあえず手を動かした、みたいなメモが見つかったので、
ファイルを消す前にここにもメモ。

これは、以前、Imagerを継承したモジュールを作った際に、
copy()が呼ばれてしまうと、Imagerオブジェクトが返ってきてしまうので、
そのImagerオブジェクトでは、ライントレースが行えないんだけど、
どうしたもんか・・・と、思って書いた記憶がある。

package Foo;
use strict;
use warnings;

sub new {
    my $pkg = shift;
    my $str = shift;
    bless { foo => $str }, $pkg;
}

sub foo {
    print 'foo = ', $_[0]->{foo}, "\n";
}

sub copy {
    my $self = shift;
    #__PACKAGE__->new( $self->{foo} );
    my $pkg = ref $self;
    $pkg->new( $self->{foo} );
}

package Bar;
use strict;
use warnings;

use parent -norequire, qw(Foo);

sub bar {
    print "bar() called.", "\n";
}

package main;
use v5.14;
use strict;
use warnings; 

my $obj = Foo->new( '123' );
$obj->foo();

my $obj_ex = Bar->new( '456' );
$obj_ex->foo();
$obj_ex->bar();

my $new_obj = $obj_ex->copy();
print '$new_obj is ', ref $new_obj, "\n";

$new_obj->foo();
$new_obj->bar();

実行するとこんな感じ。
$ perl aaa.pl
foo = 123
foo = 456
bar() called.
$new_obj is Bar
foo = 456
bar() called.

use base qw(Foo);でもいんだけど、
ここ(perldoc.jp)を見る限り、parentの方が良さそう。

-norequireは、同じファイルに親クラスが定義されているので、
親クラスの定義がrequireされないように指定している。
親クラスのファイル(*.pm)が存在するのであれば、これは必要ないっぽい。

で、結局、上記の問題は解決しなかったんだけど、
Perlでクラスを継承する方法が少し分かった。

ちなみに、parentはv5.10.1から入ったようなので、
そこだけ気を付ける必要がある。

$ corelist parent

Data for 2014-05-27
parent was first released with perl v5.10.1

おしまい。

Leave a Comment