クラスを継承する




  1. Perl




  2. オブジェクト指向



  3. クラスの継承

 今回は他のクラスを継承する方法について解説します。

他のクラスを継承する

 他のクラスを継承してみます。少し注意してほしいことがあります。通常はクラスというものは、ファイル単位で作成します。もしパッケージ名を、Componet にしたとすると、そのパッケージだけを含んだファイルをComponent.pm という名前をつけて保存します。

 そして、そのクラスを利用したいスクリプトから呼び出します。けれども、解説を簡易にするために、多くのサンプルでは、ひとつのファイルの中に複数のクラスを記述します。

 x, y というメソッドを持つComponentというクラスを継承したButtonクラスの例を考えてみます。

@ISAを使用した継承

 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パッケージに戻って実行するのが自然なためそのようにしています。