第31回 Perlでオブジェクト指向を書こう

さて、オブジェクト指向のプログラムを書いてみようといったので書いてみました〜。

といってもいきなりソースを載せるのもなんなので、まずどんなプログラムを書こうとしたか。
そこからお話させていただきます。

今朝、電車に乗ると必死で、PSPをされている方がおられました(たぶんモンスターハンターだと思われる)。
ということで、なにか冒険者が冒険するようなものを作ってみたいと思います。
でも、そんな大げさなものは作れないので、たんに主人公だけを作ってみたいと思います(といってもこの主人公もできることは少ないのですが)。

主人公

まず、主人公ですから、名前を持ちましょう。そしてこの主人公には年齢の情報も持たせます。そしてこの主人公は、袋(bag)をもっており、なんでもそこに入れることができます。


主人公ができること

主人公は袋を持っていますので、何かを袋に入れることができます。
以下のようにpushメソッドを使えば、袋にモノを入れれるようにしたいと思います。

$c->push('やくそう');


さらに、袋の中身は、check_bagというメソッドで表示させるようにしてみましょう。

$c->check_bag();

結果:

$VAR1 = {
          '肉' => 1,
          'やくそう' => 2
        };

めんどくさいので表示には Data::Dumper を用いています。
袋を覗けば、今、アイテムを何個ずつ持っているかがわかります。
この例だと、 肉を1つ と やくそうを2つ持っています。



get_oldというメソッドが呼び出されれば、年をひとつ取るようにしましょう。

$c->get_old();


そして、今の年齢を表示させるには、 check_ageというメソッドを使うことにしましょう。

$c->check_age();

結果:

2才

ということで....

実現したソース

以上を実現したソースがこちらである。
(行番号を付けました)

  1   use strict;
  2  
  3   package Human;
  4   use Data::Dumper;
  5   sub new {
  6     my $c = shift;
  7     bless $c;
  8   }
  9  
 10   sub check_bag {
 11     my $self = shift;
 12     print Dumper $self->{'bag'};
 13   }
 14  
 15   sub push {
 16     my $self = shift;
 17     my $item = shift;
 18     $self->{'bag'}->{$item}++;
 19   }
 20  
 21   sub get_old {
 22     my $self = shift;
 23     $self->{'age'}++;
 24   }
 25  
 26   sub check_age {
 27     my $self = shift;
 28     print $self->{'age'}, '才',  "\n";
 29   }
 30    
 31    
 32   package main;
 33   my $human = Human::new({'name' => 'ビンゴ',
 34                           'age'  => 1,
 35                           'bag'  => {}
 36                         });
 37  
 38   $human->push('やくそう');
 39   $human->push('やくそう');
 40   $human->push('肉');
 41   $human->check_bag();
 42  
 43   $human->get_old();
 44   $human->check_age();

結果:

$VAR1 = {
          '肉' => 1,
          'やくそう' => 2
        };
2才

ソースの説明は

ソースの説明は次回より

それではまた〜

あ、せっかく名前という情報を持っているのに表示させてない

実は

今回の題目は、電車の中でPSPをやっている人をみたというのもあるのだけれど、
昔、
Ken Kobayashi CPP9
を読んで、面白いな〜 と思ったからである。
(リンク先はC++ですが)






# ここからは気になったこと
use Data::Dumper;
の位置から考えて、use strict;の位置ってこれでいいのかな....