- Perl ›
- オブジェクト指向プログラミング ›
- here
@ISA - 親クラスの取得・設定
特殊変数@ISA
で、親クラスを取得・設定することができます。単一継承を行う場合は、クラスをひとつだけ、多重継承を行う場合は、二つ以上指定します。
# 単一継承 package MyClass; our @ISA = ('ParentClass'); # 多重継承 package MyClass; our @ISA = ('ParentClass1', 'ParentClass2');
他のクラスを継承してみます。少し注意してほしいことがあります。通常はクラスというものは、ファイル単位で作成します。もしパッケージ名を、Componet にしたとすると、そのパッケージだけを含んだファイルをComponent.pm という名前をつけて保存します。
そして、そのクラスを利用したいスクリプトから呼び出します。けれども、解説を簡易にするために、多くのサンプルでは、ひとつのファイルの中に複数のクラスを記述します。
x, y というメソッドを持つComponentというクラスを継承したButtonクラスの例を考えてみます。
Perlの継承はどのような仕組みで動くのでしょうか。それを説明するために以下のサンプルを動かしてみましょう。
use strict; use warnings; # コンポーネントクラス package Component; sub x { return 5 } # ボタンクラス package Button; # 継承 our @ISA = ('Component'); sub new { bless {}, 'Button' } package main; # ボタンクラスを使用する。 my $button = Button->new; print $button->x;
このスクリプトを動かしてみるとわかるのですが、 5と表示されると思います。大切なことは、Buttonクラスには、 x というメソッドはないにもかかわらず、 xというメソッドを呼ぶことができるということです。
Componentクラスにxというメソッドがあり、ButtonクラスがComponentクラスを継承しているので、このようなことができます。
our @ISA = ('Component');
という部分に注目してください。これが継承を行っている部分です。継承するにはパッケージ変数 @ISA に継承したいクラスの名前を代入するだけです。
package main
という部分が気になるかもしれません。クラスをファイルに分けて記述した場合はこの記述はいりません。
スクリプトが始まったときは、最初はmainパッケージというものに属しています。Button クラスを利用するときに、mainパッケージに戻って実行するのが自然なためそのようにしています。