baseモジュール - クラスの継承
baseモジュールを使用すると、クラスを継承することができます。
# クラスの継承 package MyClass; use base 'ParentClass';
継承を行うと親クラスにあるメソッドをサブクラスで呼び出すことができるようになります。親クラスのParentClassでparseというメソッドが定義されていた場合はサブクラスのMyClassでもparseメソッドを呼び出すことができます。
親クラス ▲ サブクラス ← 親クラスのメソッド + 自身のメソッドを利用できる
単一継承と多重継承
Perlは多重継承をサポートしますが、多重継承はモジュール間の継承関係をとても複雑にしてしまいます。ですから、継承は単一継承に限るのがモジュールの関係をシンプルに保つ上でよいとされています。
実際、単一継承でプログラムを組むと、わかりやすく可読性の高いプログラムになります。単一継承でできないことはありませんし、設計もきれいになりますので、ぜひ単一継承でプログラムを作成してみてください。
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モジュールを使って書いていきたいと思います。
parentモジュール
parentモジュールは、base
モジュールの動作を簡潔にしたものです。
package MyClass; # parentモジュール use parent 'ParentClass';
親クラスParentClass
は、コンパイル時に、requireを使って読み込まれ、特殊変数@ISAの最後に追加されます。
requireを実行したくない場合は、-norequire
オプションを使用する必要があります。
package Foo; sub exclaim { "I CAN HAS PERL" } package DoesNotLoadFooBar; use parent -norequire, 'Foo', 'Bar';
parent
モジュールは。v5.10
からコアモジュールです。
base
モジュールは。v5.0
からコアモジュールです。