parentを使ってクラスの継承をしてみる
いまいち良く分かってないので、
とりあえず手を動かした、みたいなメモが見つかったので、
ファイルを消す前にここにもメモ。
これは、以前、Imager
を継承したモジュールを作った際に、
copy()
が呼ばれてしまうと、Imager
オブジェクトが返ってきてしまうので、
そのImager
オブジェクトでは、ライントレースが行えないんだけど、
どうしたもんか・・・と、思って書いた記憶がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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