このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
さて、これからプロパティについて考えていくので、
その題材となるクラスを考えよう。
今回は、Employee オブジェクトを作る。
Employee = 従業員だ。プログラミングのサンプルとして、
どこにでも出てきそうな名前だ。
Employee というオブジェクトは、以下の属性を持つ。
・名前
・性別
・体重
・給料
後々これを使って色々やるつもりなので、
なんで体重やねん。というつっこみはなしで。
さて、上を元にオブジェクトを作ってみよう。
my $jack = {
'name' => 'Jack',
'gender' => 'male',
'salary' => 160000,
'weight' => '65kg',
};
完成。……文句を言ってはいけない。
連想配列(ハッシュ)は、非常に汎用化されたクラスであり、
そのインスタンスとして従業員を定義することもできるのだ。
Perl においては、ハッシュが組み込み型となっているが、
その他の言語では、通常はクラスであることが多い。
ただ、組み込み型を使うのはサボりすぎなんで、
モジュールとしての枠組みを被せることにしよう。
========== Employee.pm ==========
package Employee;
use v5.6.1;
use strict;
use warnings;
BEGIN {
our $Version = '0.01';
}
sub new {
my ($package, %identity) = @_;
$package = (ref $package or $package or __PACKAGE__);
bless(\%identity, $package);
}
1;
========== end of Employee.pm ==========
最も基本となるパッケージである。
今回は、単に引数のハッシュを取り、
そのコピーを bless してオブジェクトにしている。
テストしてみよう。
========== EmployeeTest.pl ==========
#!/usr/local/bin/perl
use lib '.';
use Employee;
my $jack = Employee->new(
'name' => 'Jack',
'gender' => 'male',
'salary' => 160000,
'weight' => '65kg',
);
print "Package: ", ref($jack), "\n";
print "Name: $jack->{'name'}\n";
$jack->{'name'} = 'Fake';
print "Name: $jack->{'name'}\n";
========== end of EmployeeTest.pl ==========
実行してみる。
$ ./EmployeeTest.pl
Package: Employee
Name: Jack
Name: Fake
どうだろう。ref 関数が返すのはパッケージ名。
$jack は確かに Employee のインスタンスだ。
しかし、アクセス方法はハッシュと変わらない。
なので、名前にも代入することができてしまうのだ。
この状態は、いわゆる public フィールドを使った実装、
もしくは、構造体と呼ばれるクラスである。
つまり、アクセス制限を持たないため、
外部から自由に操作できてしまうのだ。