読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Template Methodパターン

perl design pattern

C++の抽象クラスとかは、ほぼこのTemplate Methodパターンに当てはまると思うんですが、
Perlだと「抽象クラス」を実現するための言語としての直接的な機能はない感じなので、ちょびっとちがう感じなのかもしれません。


要は抽象クラスでテンプレートだけ決めといて、あとはそれを継承したサブクラス(具象クラス)の方で実装しよう!な!という感じみたいです。
たぶんですけどみんな無意識に使ってるよなーとか思ったよ。
ちょっと考えまして、こんなん作ってみました。

LoveTeamクラスは、野球チームを愛するみなさんをモデル化した抽象クラスだ!
print_loveもprint_hateも定義されていないので、みなさんとてもお困りでしょう。

package LoveTeam;

sub new {
    bless {}, $_[0]
}

sub love {
    my $self = shift;
    $self->print_love();
    $self->print_hate();
}

1;

そこで具象クラス作るよ!
ジャイアンツだー。

package LoveTeam::Giants;
use base 'LoveTeam'; 

sub print_love {
    print "ジャイアンツ大好き!\n";
}

sub print_hate {
    print "ヤクルトはグライシンガーさっさと譲れや\n";
}

1;

タイガースだー!

package LoveTeam::Tigers;
use base 'LoveTeam'; 

sub print_love {
    print "タイガース大好き!\n";
}

sub print_hate {
    print "巨人は生理的に受け付けませんね!\n";
}

1;

カープだー!

package LoveTeam::Carp;
use base 'LoveTeam'; 

sub print_love {
    print "カープ大好き!!\n";
}

sub print_hate {
    print "阪神は新井も金本も返せ!あとシーツも!\n";
}

1;    

疲れたので他はかんべんしてください><
mainはこんな感じで作ったよ。

※シンボリックリファレンスじゃないので、no strict 'refs'はいりません!id:syou6162さんありがとう!

use strict;
use LoveTeam::Giants;
use LoveTeam::Tigers;
use LoveTeam::Carp;

my @teams = qw(Giants Tigers Carp);
my @objs;
# { いらない
#    no strict 'refs'; いらない
    @objs = map { "LoveTeam::$_"->new() } @teams
# } いらない

$_->love() for (@objs);

出力。

ジャイアンツ大好き!
ヤクルトはグライシンガーさっさと譲れや
タイガース大好き!
巨人は生理的に受け付けませんね!
カープ大好き!!
阪神は新井も金本も返せ!あとシーツも!