第28回 blessは各々のパッケージに任せよう

さて、ただblessするだけの関数を作ったが、
これを各々のパッケージに持たせることで、
各パッケージに、blessされた変数を返してもらうことにする。

これにより、

パッケージ名::blessされた変数を返す関数

という書式で、そのパッケージの関数を呼び出せる変数がもらえることになる。

例えば、Hogeパッケージの関数を呼び出すことができる変数を返してもらうなら、

my $c = Hoge::new();

と書ける。
あとは、

$c->h()

といった感じで使っていけばいいのだ。
なお、今回は、 blessされた変数を返してくれる関数を new という名前にした。



それでは、もっと具体的な例を見てみよう。

use strict;

package Hoge;
sub new {
  my $c = shift;
  bless $c;   # Hogeパッケージ内で呼ばれているので、第2引数は'Hoge'が補われているね
}

sub h {
  print 'Hogeの関数', "\n";
}

package Foo;
sub new {
  my $c = shift;
  bless $c;   # Fooパッケージ内で呼ばれているので、第2引数は、'Foo'が補われているね
}

sub f {
  print 'Fooの関数', "\n";
}

package main;
my $c = Hoge::new({}); # 何も値を持たない無名ハッシュをnewに与えている
$c->h(); # 呼び出し!

my $d = Foo::new({}); # 何も値を持たない無名ハッシュをnewに与えている
$d->f(); # 呼び出し!

結果:

Hogeの関数
Fooの関数

このソースでは、各パッケージのnew関数(パッケージが違うので同じ名前でも問題ない)は、なにか引数をもらうことにしてあるので、無名ハッシュを与えてある。無名シリーズは、いきなりリファレンスをもらえるので、リファレンスを引数にとるblessと非常に相性が良いのだ(関数の引数にハッシュを渡すならリファレンスじゃないとまずいことになるというのも理由のひとつだが...)。



このようにして、各パッケージの決まった名前(プログラマが自分で勝手に決める)の関数から、そのパッケージの関数が呼べるもの(つまりblessされたもの)をもらうのが便利である。Hogeのパッケージの関数が呼びたければ、Hogeのnew関数を呼び、その戻り値を使って、Hogeのパッケージを呼ぶ。Fooのパッケージの関数が呼びたければ、Fooのnew関数を呼び、その戻り値を使って、Fooのパッケージを呼ぶ。こういった寸法である。


ただし、忘れてはならないのは、 -> で呼び出した場合、第1引数に -> の左の部分が渡ってしまうことだ。
だから、この手法は一般的にオブジェクト指向のときにしか使われない。



で、オブジェクト指向ってどないして実現すんねん。
っとなるのだが、実は、オブジェクト指向に必要な機構はすべてお話してしまった。



あー なんて話が長くなるのだろうか。
これらの機構をつかってPerlオブジェクト指向の話をしていこう(うまくできたらいいな)。
(というか、もうオブジェクト指向はできているのであるが)


ということで、 また次回〜