コンストラクタの継承

親 = Kaizoku.pm
子 = onepiece.cgi

Kaizoku.pm


sub new {
my $class = shift;
my %args = @_;

my $self = {
tmpl_dir => $args{tmpl_dir},
tmpl_message => $args{tmpl_message}
};
bless $self, $class;
}

これが、親のコンストラクタです。ここに、tmpl_formという属性を付け加えたい
のですが、継承してオーバーライドする必要があります。

onepiece.pm


package GestBook;
use base qw(AppBase);
sub new {
my $class = shift;
my %args = @_;
my $self = $class->SUPER::new(%args);

tmpl_form => $args{tmpl_from};
return $self;
}

package GestBook;
use base qw(AppBase);

親モジュールを使います、と宣言。

my $class = shift;
my %args = @_;

親モジュールと同じように書きます。$slef = shift;としないように。
%argsをうけとらないと、global symbolエラーがでますよ。

my $self = $class->SUPER::new(%args);

オーバライドの書き方は前も勉強しました。
でもこう書いてもどうしてもうまくいかなかったのは、
%argsを渡していなかったからでした。

tmpl_form => $args{tmpl_from};

付け加えたい属性を記入します。

return $self;

blessしません。blessは親がするので、ここでは$selfの値を返すだけです。