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