27章 Perlでオブジェクト指向 privateなメンバーデータの書き方 ハッシュを使う

my でメンバーデータを定義する方法だと、
実はそれはクラスの共有変数になっていまいました。
メンバーデータのような実は違うような。

では、メンバーデータをオブジェクトのハッシュ値で定義してみましょう。

ファイル名:Human.pm

package Human;

use strict;

###########
sub new
{
my $class = shift;
my $args = shift;

my $self = {};
$self->{a} = undef;
$self->{b} = undef;
bless($self, $class);
return $self;
}
###############
sub set
{
my ($self,$x, $y)  = @_ ;
$self->{a} = $x;
$self->{b} = $y;
}
###############
sub calc2
{
my ($self)  = @_ ;

my $c = $self->{a} + $self->{b} ;
print “Human->calc2 = $c \n”;
}
##############
1;

実行ファイル名:test1.pl

use strict;
use Data::Dumper;
use Human;

my $man = Human->new();
my $man2 = Human->new();
$man->set( 1 ,2 );
$man2->set( 5 ,6 );

$man->calc2( );
$man2->calc2( );

 
実行結果:

 >perl test1.plHuman->calc2 = 3
Human->calc2 = 11

2つのオブジェクト$manと$man2のメンバーデータがそれぞれ違うこと、
別メモリにとられていることがわかりました。
これこそクラスのメンバーデータらしくなってきました。
では次をみてみましょう。
実行ファイル名:test2.pl

use strict;
use Data::Dumper;
use Human;

my $man = Human->new();
$man->set(1,2);
$man->calc2( );

$man->{b} = 5;
$man->calc2( );

$man->{d} = 10;
print $man->{d} ; print “\n”;

実行結果:

 >perl test2.plHuman->calc2 = 3
Human->calc2 = 6
10

オブジェクトの外部から $man->{b} なんてアクセスができたりします。
また、$man->{d} なんてクラス作成時に定義するつもりもなかった
メンバーデータが後付できたりします。

つまり、privateなメンバーデータではないです。隠ぺいできていません。
publicっぽい。
でも、後付できるので本当のpublicでもない。