Object::Simpleを使ったPerlオブジェクト指向プログラミング入門
Object::Simpleを使ったPerlオブジェクト指向プログラミング入門です。
Object::Simpleのインストール
Object::Simpleをインストールします。cpanまたはcpanmでモジュールをインストールできます。
# cpan cpan Object::Simple # cpanm cpanm Object::Simple
クラスの定義
Perlではクラスの定義はpackageを使って行います。最初に-baseフラグを使ってObject::Simple
を継承したクラスを作成します。
package Point; use Object::Simple -base;
コンストラクタ
コンストラクタであるnewというメソッドを使ってクラスからオブジェクトを生成することができます。このnew
はObject::Simpleから継承されたものです。
my $point = Point->new;
newメソッドは、ハッシュあるいはハッシュのリファレンスを受け取ることができます。
my $point = Point->new(x => 1, y => 2); my $point = Point->new({x => 1, y => 2});
この値は、フィールドに設定されます。
アクセッサ
次にアクセッサを定義してみましょう。アクセッサとはフィールドにアクセスするためのメソッドのことです。アクセッサを定義すれば、フィールドにアクセスすることができます。
アクセッサを生成するにはhas関数を使用します。
has 'x';
アクセッサを定義するとフィールドにアクセスすることができます。
# 値の設定 $point->x(1); # 値の取得 my $x = $point->x;
フィールドのデフォルト値を指定することもできます。
has x => 1;
フィールドが設定されていない場合は最初にアクセッサが呼び出されたときにデフォルト値がフィールドに設定されます。
# デフォルト値の1を取得 my $default = $point->x;
もしリファレンスやオブジェクトをデフォルト値として指定したい場合は、サブルーチンのリファレンスの戻り値にする必要があります。
has x => sub { [] }; has x => sub { {} }; has x => sub { Point->new };
複数のアクセッサを一度に生成することもできます。
has [qw/x y/]; has [qw/x y/] => 0;
継承
継承を行うには-baseを使います。Pointを継承したPoint3Dを作ってみましょう。
package Point; use Object::Simple -base;
package Point3D; use Point -base;
スーパークラスのメソッドの呼び出し
SUPER疑似クラスを使って、スーパークラスのメソッドを呼び出すことができます。
package Point3D; use Point -base; sub clear { my $self = shift; $self->SUPER::clear; }
コンストラクタのオーバーライド
サブクラスでコンストラクタをオーバーライドしたい場合があると思います。コンストラクタをオーバーライドするには次のようにします。
package Point; use Object::Simple -base; sub new { my $class = shift; my $self = $class->SUPER::new(@_); return $self; }
newはコンストラクタなので必ずオブジェクト自身を返すようにします。
クラスの作成 - 実践編
これだけ覚えればPerlのオブジェクト指向プログラミングはほぼマスターです。実践してみましょう。PointクラスとPoint3Dクラスを作成してみます。
Pointクラス
- Pointは点を表すクラスです。
- xとyというフィールドがあり、アクセッサを持ちます。
- xとyの値を0にクリアするclearというメソッドを持ちます。
package Point; use Object::Simple -base; has x => 0; has y => 0; sub clear { my $self = shift; $self->x(0); $self->y(0); } 1;
末尾に「1;」という記述があるのは、モジュールを書くファイルの末尾が真でなければならないというルールがあるためです。
Pointクラスは以下のように使用することができます。
use Point; my $point = Point->new(x => 3, y => 5); print $point->x; $point->y(9); $point->clear;
Point3Dクラス
- Point3Dは3次元の点を表すクラスです。
- x,y,zというフィールドがあり、アクセッサを持ちます。
- x,y,zの値を0にクリアするclearというメソッドを持ちます。
Point3DはPointを継承して作成します。clearメソッドはxとyとzの値をクリアするためにオーバーライドされています。
package Point3D; use Point -base; has z => 0; sub clear { my $self = shift; $self->SUPER::clear; $self->z(0); } 1;
Point3Dクラスは以下のように利用することができます。
use Point3D; my $point = Point->new(x => 3, y => 5, z => 8); print $point->z; $point->z(9); $point->clear;
実行できるサンプル
実行できるサンプルを書いておきますね。
lib/Point.pm
libというディレクトを作成して、その中にPoint.pmというファイルを作成してください。
package Point; use Object::Simple -base; has x => 0; has y => 0; sub clear { my $self = shift; $self->x(0); $self->y(0); } 1;
lib/Point3D.pm
libというディレクトの中にPoint3D.pmというファイルを作成してください。
package Point3D; use Point -base; has z => 0; sub clear { my $self = shift; $self->SUPER::clear; $self->z(0); } 1;
object.pl
クラスを読み込んで利用するサンプルです。libモジュールを使うことで、モジュールの検索パスを追加できます。
use strict; use warnings; use lib 'lib'; use Point3D; my $point = Point3D->new(x => 3, y => 5, z => 8); print $point->z . "\n"; $point->z(9); print $point->z . "\n"; $point->clear; print $point->z . "\n";
プログラムの実行
ディレクトリ構成は以下のようにします。
object.pl lib - Point.pm - Point3D.pm
以下のように実行してください。
perl object.pl
出力結果です。
8 9 0
オブジェクト指向プログラミングの詳細
オブジェクト指向プログラミングの詳細については、以下の記事を見てください。