!!!Perlオブジェクト指向 !!オブジェクト指向の基本要素 *クラスとは、パッケージ(package) *メソッドは、サブルーチン(sub) *オブジェクト(インスタンス)は、構造体 !!呼び出し方 *オブジェクト指向 class->method(@arg); # &class::sub("class",@arg);の呼び出しと同等、文字列クラス名と引数配列 {{code Perl,0,0 package main; use strict; use warnings; use flower; my $obj_ref = flower->new();#//コンストラクタの呼び出し $obj_ref->hana_set('himawari'); #//メソッドの呼び出し }} *PERLパケージ &package::sub(@arg); #引数配列 *構造体 bless {}, "class"; #//無名ハッシュのリファレンスとクラス名の文字列をつなぐ。 **blessがあるサブルーチンを「コンストラクタ」と呼びます **blessできるもの、ハッシュ、配列、スカラー、正規表現、サブルーチン、形ブログ {{code Perl,0,0 package flower; use strict; use warnings; sub new{ #//コンストラクタ my $class = shift; my $self = {}; return (bless $self=>$class); #//blessされたリファレンスを返す } sub hana_set{ #//メソッド my ($self,$name) = @_; $self->{'name'}=$name; } }} *引数を持たない &Package::sub(); と Packege->sub(); は同じ結果を返す !!継承 *クラスの継承(class inheritance)には use base qw( BASE ) を使います。BASE には親クラス(base class)となるクラスの名前(パッケージ名)を空白で区切って書き並べます。 *base 宣言したPACKAGEの中に該当呼び出しメソッドが無い場合、base宣言したクラス内にそのメソッドがあるか探索します。 {{code Perl,0,0 package main; use strict; use warnings; use color; my $obj_ref = color->new();#//コンストラクタの呼び出し $obj_ref->hana_set('himawari'); #//メソッドの呼び出し $obj_ref->color_set('red'); #//メソッドの呼び出し package color; use strict; use warnings; use base qw( flower ); #//継承 sub color_set{ #//メソッド my ($self,$name) = @_; $self->{'color'}=$name; } }} !!クラスメソッドと インスタンスメソッドとの違い *その最初の引数がインスタンス(ブレスされたリファレンス) なのかクラス名(文字列)なのかという点だけです。 !!クラスに対して呼ばれたのか それともインスタンスに対して呼ばれたのかを区別する方法 *ref演算子をブラスされたリファレンスに対して使うと 文字列(クラス名)を返し、(クラス名のような)文字列に 対して使うと "" を返します !!SUPER SUPER::method は現在のパッケージの @ISA から method を探し, 最初に見つかったものを呼び出します. これは $class の @ISA は見ない点に注意してください.