Perl のオブジェクト指向
河野真治 @ 琉球大学情報工学です。
Perl のオブジェクト指向は、package と hash (のreference) を
bless で結びつけるだけ。hash (連想配列) 以外でのreferenceで
もいいんだけど、hash を使うものでしょう。
package Class;
$obj = {attribute=>'value'};
bless $obj;
hash の中味にはblessは関与しないから、インスタンス変数の継承
がどうとかこうとかの問題から、うまく逃げている。めんどくさく
なく多重継承を実現する一つの方法だね。誰が、いつ、どこで初期
化しても良い。初期化しなくても良い。なくても文句言いません。
気軽に多重継承出来る。
必ず、オブジェクトを明示してメソッド呼び出しするので、Java
みたいに単なる関数呼び出しとメソッド呼び出しが混乱することも
ない。 Package の変数は、クラス(static) 変数に相当し、インス
タンス変数ではないです。
hash が見えるのを嫌う人も多いが、オブジェクトを呼び出す方で
任意の属性を付加出来るのは便利。普通のオブジェクト指向言語で
は許されない。そのあたりがPerlっぽい。 呼出側で、オブジェク
トをカスタマイズ出来る。 一方で、hash の処理の重さは気になる
ね。hash のkeyをquote する必要は、Perl 5 からなくなった。
hash を明示するのは、常に、this.var みたいな書き方をするのに近い。
class Hoge {
int i;
Hoge(int i) { this.i = i; }
}
とかに似てる。Perl だったら、
package Hoge;
sub new { my ($i) = @_; my $self = {} ; $self->{i} = $i; bless $self; }
かな。
sub new { my ($i) = @_; bless {i=>$i}; }
でもいい。
Constructor や new がblessという演算子なので、どの関数呼び出
しがConstructorかがわからない。自分でオブジェクトの作り方を
決める必要がある。new() か、factory pat tern を使うのが普通
だろう。perldoc perlobj すると、initialize() をConstructorと
分けている。
Interface とかabstract class もない。このあたりは、コンパイ
ラのチェックの機能でしかないので、自分で「作っているつもり」
になれば良い。document で明示しよう。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735