Perlにおけるクラスメソッドとインスタンスメソッドの違い
オブジェクト指向,面倒ですよね.
学生時代はProcessingを手続き型で書く程度だったので
未だによくわかってません
そして,オブジェクト指向ではないPerlならではの
独自的な用語が用いられるため,ほんとさっぱりです.
一般的なOOP | Perl | 別名 |
---|---|---|
クラス | パッケージ | - |
メソッド | サブルーチン | - |
インスタンス | データ構造 | オブジェクト |
とんでもなくややこしいですね…
以下はメモなのでこの記事は参考になりません
クラスとインスタンス
コードにおけるクラスとインスタンス
かんたんなコードです!!
package A; my $obj = B->new; my $result = $obj->keep_cat('mike'); 1; package B; sub keep_cat { my ($self, $name); print "the cat name is $name"; } sub new { my ($class, $args); bless($args, $class); } 1;
このプログラムにおいて,クラスを宣言しているのは
package A; package B;
この部分です.
Perlではよく「パッケージ」といいますが
これがそのままクラス名になります.
Perlはクラス宣言に何か明確なものが必要ではなく
メソッドが押しこんであるパッケージ=クラス です
ちなみに
ファイル名も「A.pm」とかにしないと
動かなかったような気がします
_(┐「ε:)_<どうだっけ?
このパッケージ内のデータ構造を
他のオブジェクト指向言語では「オブジェクト」と呼んでます.
さっきもでてきましたね.
ではインスタンスはどれかっていうと
その前にコンストラクタを見つけましょう.
Perlはコンストラクタを通してblessというものをしなければ
オブジェクトにすることができません.
sub new { my ($class, $args); bless($args, $class); }
この,newと名付けられたメソッドを
一般的にコンストラクタと呼びます.
別にnewって名前じゃなくてもいーんですが
慣習です慣習.
プログラミングの慣習には従っておきましょう.
クラスAにおいて
my $obj = B->new;
こう表記することで,
クラスBにblessされたオブジェクトが生成されます.
では実際に
そのオブジェクトを使ってみましょう.
my $result = $obj->keep_cat('mike');
第一引数にインスタンス$objを渡してます.
これが呼ぶメソッドは,$objが紐付いたクラスBにある
sub keep_cat { my ($self, $name); print "the cat name is $name"; }
これですね.
$selfには第一引数のインスタンス$obj,
$nameには'mike'がはいっています.
コード動かないかも.