理系学生日記

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

Template Methodパターン

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

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

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

|perl| package LoveTeam;

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

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

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

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

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

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

1; ||< タイガースだー!

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

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

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

1; ||< カープだー!

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

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

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

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

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

|perl| 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); ||< 出力。

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