Class::Struct - オブジェクト指向を提供するコアモジュール
Class::Structは、Perlにオブジェクト指向の機能を提供する古典的なモジュールです。コンストラクタnewの自動生成、アクセッサの自動生成ができます。アクセッサとは、フィールドの設定・取得を行うためのメソッドのことです。
Perl入門ゼミでは、オブジェクトの基本型として、ハッシュリファレンスを持ち、スカラのアクセッサを提供する方法を解説します。
xとyというフィールドを持つPointクラスの作成
Class::Structを使って、xとyというフィールドを持つPointクラスを作成してみましょう。
package Point; use Class::Struct __PACKAGE__, { x => '$', y => '$', };
useでは、モジュール名の後ろに引数を渡すことができます。
第一引数は、パッケージ名です。この引数で、どのパッケージに対して、コンストラクタやアクセッサを生成するのかを指定します。__PACKAGE__は、現在のパッケージ名を返す関数で、Pointが返ります。
第二引数は、フィールドを定義した、ハッシュのリファレンスです。アクセッサが自動生成されます。
Pointクラスの利用
Pointクラスを利用してみましょう。先ほどのコードに続けて以下を記述します。
package main; # オブジェクトの生成 my $point = Point->new(x => 1, y => 2); # フィールドの値をアクセッサを使って取得 my $x = $point->x; my $y = $point->y; print "($x, $y)\n"; # フィールドの値をアクセッサを使って設定 $point->x(5); $point->y(10); my $x2 = $point->x; my $y2 = $point->y; print "($x2, $y2)\n";
mainパッケージについては、パッケージの宣言の記事を参考にしてください。
コンストラクタnewの呼び出し
コンストラクタnewを呼び出すことができます。フィールドの値を渡すこともできます。
# オブジェクトの生成 my $point = Point->new(x => 1, y => 2);
アクセッサの呼び出し
値の設定・取得を行うために、アクセッサを呼び出すことができます。
# フィールドの値をアクセッサを使って取得 my $x = $point->x; my $y = $point->y; print "($x, $y)\n"; # フィールドの値をアクセッサを使って設定 $point->x(5); $point->y(10); my $x2 = $point->x; my $y2 = $point->y; print "($x2, $y2)\n";
Class::Structで、継承することはできますか?
Class::Strcutによって作成したクラスを継承することは可能ですが、制限として、フィールドを追加するということはできません。継承を行いたい場合は、フィールドを追加したい場合が、ほとんどですので、できないと考えておくのがよいでしょう。
継承を予定しているのであれば、Perlコア限定ならblessを使ってオブジェクトを作成します。CPANモジュールを利用する場合は、継承によるフィールド定義の追加をサポートしているモジュールを利用しましょう。
コンストラクタをオーバライドすることはできますか?
Class::Strcutでは、対象のクラスにコンストラクタが生成されますので、コンストラクタをオーバーライドすることはできません。
コンストラクタのカスタマイズを予定しているのであれば、Perlコア限定ならblessを使ってオブジェクトを作成します。CPANモジュールを利用する場合は、コンストラクタのカスタマイズをサポートしているモジュールを利用しましょう。