Perlゼミ

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モジュールを利用する場合は、コンストラクタのカスタマイズをサポートしているモジュールを利用しましょう。

Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「今日も元気だ、Perlで元気。
ゆとりあるITエンジニアライフのために
Perl情報を前向きに発信中!」

Twitter
フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

木本システム株式会社
ご紹介キャンペーン実施中です。契約金額の10%をご紹介料としてお支払い。

(例)30万円のシステム開発委託契約が、1年続いたら、36万円がもらえる!!!