- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!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 は見ない点に注意してください.
テストかも