Perl as OOPL

PerlOOP機構について楓 software:: ツール開発メモを参考にポイントを書く。

クラスとオブジェクトについて

  • クラスはpackage(namespaceを分けるもの)の応用。
    • あくまで動的束縛によるメンバの探索先である。
    • 抽象データ型としては機能しない。
  • オブジェクトの中身はPerlの基本データ型で、普通は連想配列
    • 別にスカラ/配列でもいいがインスタンス変数が1個だけとか配列だと非実用的。
  • クラス定義の仕方
    • パッケージにnew関数を定義。
      • newではクラス名を第1引数として受け取る。
      • 第1引数はメソッドをアロー演算子->で呼ぶと暗黙的に渡される。
    • newの中でbless関数を呼ぶ。
      • bless関数でオブジェクトとクラス名とを関連付ける。
    • ちなみにblessは別にnewの中だけでなくどこでも呼べる。
      • すなわちコンストラクタがnewというメソッドである必要さえない。
      • でも、あえてnew以外にする理由も無いのでnewにしておこう。
    • 再度blessを呼ぶことにより継承関係のない他のクラスのインスタンスへの変身もできる。

継承

  • use base を使う。
  • 多重継承の場合、継承元を@ISAにpushしていく。
  • メンバのアクセスレベルのコントロールはなし。

その他

サンプル


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)