メンバを定義
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;
実行: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.pl
Human->calc2 = 3
Human->calc2 = 11
2つのオブジェクト$manと$man2のメンバーデータがそれぞれ違うこと、
別メモリにとられていることがわかりました。
これこそクラスのメンバーデータらしくなってきました
実行結果:2
では次をみてみましょう。
実行ファイル名: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.pl
Human->calc2 = 3
Human->calc2 = 6
10
オブジェクトの外部から $man->{b} なんてアクセスができたりします。
また、$man->{d} なんてクラス作成時に定義するつもりもなかった
メンバーデータが後付できたりします。
つまり、privateなメンバーデータではないです。隠ぺいできていません。
publicっぽい。
でも、後付できるので本当のpublicでもない。