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