baseモジュールを使ってクラスを継承する
@ISAを使用したクラスの継承を解説しました。けれども、この方法は何かパッケージ変数を触っているので、ほかの言語で継承の構文を学んだ人から見るとどこか変な感じです。
もうすこし、継承を表現するわかりやすい方法があります。それは、baseモジュールを使用する方法です。
baseモジュール
Perlの継承は@ISAを使うよりも、baseモジュールを使うほうが良いです。baseモジュールは内部では、 @ISA を触って同じことをしますが、@ISAを触っていることを隠蔽してくれます。
またコンパイル時に@ISAを操作するので、ひとつのスクリプトにクラスの定義とオブジェクトの生成を書く場合に便利です。
では@ISAを使った継承をbaseを使って書き直してみます。
use strict; use warnings; # ボタンクラスを使用する。 my $button = Button->new; print $button->x; # コンポーネントクラス package Component; sub x { return 5 } # ボタンクラス package Button; # 継承 use base 'Component'; sub new { bless {}, 'Button' }
use base と記述して引数に継承したいクラス名を渡します。コンパイル時にuse base が実行されるため
my $button = Button->new;
を上側に書いても問題ありません。ここからのサンプルは、baseモジュールを使って書いていきたいと思います。