Perl as OOPL
PerlのOOP機構について楓 software:: ツール開発メモを参考にポイントを書く。
クラスとオブジェクトについて
継承
- use base を使う。
- 多重継承の場合、継承元を@ISAにpushしていく。
- メンバのアクセスレベルのコントロールはなし。
その他
- メソッドの呼び出しはこういう書き方もできる。
new クラス名;
- メソッドにクラスメソッドとインスタンスメソッドの区別はない。
- 他言語と比較したいときはオブジェクト指向の言語比較論を参照。
- perltoot - トムによるPerlオブジェクト指向チュートリアルも参考に。
サンプル
use strict;package Demo;
sub new {
my $class_name = shift;
bless( { name => $class_name, }, $class_name );
}sub hello { print "こんにちはこんにちは!\n"; }
sub name { my $self = shift; print "ぼく" . $self->{name} . "ちゃん!\n"; }
sub foo { my $self = shift; @_ ? $self->{foo} = shift : $self->{foo} }
sub show { my $self = shift; $self; }
1;
use strict;package SubDemo;
use base qw(Demo);
sub hello { print "ハローハロー!\n"; }
1;
use strict;
use Demo;my $demoobj = new Demo;
# demo test
print "demo 1 - message to the Instance or the Class \n";print "- instance method call \n";
print "++ 1 \n";
hello $demoobj;
print "++ 2 \n";
$demoobj->hello;print "- class method call \n";
print "++ 1 \n";
hello Demo;
print "++ 2 \n";
Demo->hello();
print "++ 3 \n";
Demo::hello;use SubDemo;
my $subdemoobj = new SubDemo;
print "demo 2 - polymorphism \n";
$demoobj->hello;
$demoobj->name;
$subdemoobj->hello;
$subdemoobj->name;print "demo 3 - accessor \n";
$demoobj->foo("さようならさようなら!");
print $demoobj->foo,"\n";
$demoobj->foo(100);
$demoobj->foo($demoobj->foo + $demoobj->foo);
print $demoobj->foo,"\n";print "demo 4 - show the first argument \n";
print "class returns --" . Demo->show . "\n";
print "object returns --" . $demoobj->show . "\n";
実行結果
demo 1 - message to the Instance or the Class - instance method call ++ 1 こんにちはこんにちは! ++ 2 こんにちはこんにちは! - class method call ++ 1 こんにちはこんにちは! ++ 2 こんにちはこんにちは! ++ 3 こんにちはこんにちは! demo 2 - polymorphism こんにちはこんにちは! ぼくDemoちゃん! ハローハロー! ぼくSubDemoちゃん! demo 3 - accessor さようならさようなら! 200 demo 4 - show the first argument class returns --Demo object returns --Demo=HASH(0x1625118)