タヌキのお散歩
タヌキのお散歩

Perlオブジェクト指向の変更点

現在人来訪中
トップ 一覧 検索 ヘルプ RSS ログイン 印刷
  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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 は見ない点に注意してください. 

テストかも