演算子のオーバーロード
オブジェクトで演算子をオーバーロードすることでオブジェクト同士の演算を行う
'work/Module01.pm'
# パッケージ名定義
package Module01;
my $price;
# コンストラクタ
sub new {
# オブジェクトを取得
my $class = shift;
print "Module01:test-constract\n";
# リファレンス
my $ref = {};
$ref->{price} = $price;
# オブジェクト生成
my $obj = bless $ref, $class;
# オブジェクト返却
return $obj;
}
# インスタンスメソッド
sub method1{
# オブジェクト
my $obj = shift;
# 引数を取得
($_price) = @_;
$obj->{price} = $_price;
print "Module01:test-method1\n";
}
# デストラクタ
sub DESTROY {
# オブジェクトを取得
my $obj = shift;
# 処理
print "Module01:test-descract\n";
}
# モジュール終端
1;
'work/Module02.pm'
# パッケージ名定義
package Module02;
use strict;
use warnings;
my $price;
use overload '+' => "_add"; # +演算子をオーバーロードする
sub _add
{
# 引数を取得
my ($x, $y) = @_;
my $value_x = (ref $x) ? $x->{price} : $x;
my $value_y = (ref $y) ? $y->{price} : $y;
return $value_x + $value_y;
}
# コンストラクタ
sub new {
# オブジェクトを取得
my $class = shift;
print "Module02:test-constract\n";
# リファレンス
my $ref = {};
$ref->{price} = $price;
# オブジェクト生成
my $obj = bless $ref, $class;
# オブジェクト返却
return $obj;
}
# インスタンスメソッド
sub method1{
# オブジェクト
my $obj = shift;
# 引数を取得
my ($_price) = @_;
$obj->{price} = $_price;
print "Module02:test-method1\n";
}
# インスタンスメソッド
sub method2{
my $obj = shift;
print "Module02:test-method2\n";
}
# デストラクタ
sub DESTROY {
# オブジェクトを取得
my $obj = shift;
# 処理
print "Module02:test-descract\n";
}
# モジュール終端
1;
'sample.pl'
# プラグマ
use strict;
use warnings;
# モジュール取り込み
use work::Module01;
use work::Module02;
# メインスクリプト
my $obj1 = Module01->new();
my $obj2 = Module01->new();
$obj1->method1(100); # Module01のmethod1が呼び出される
$obj2->method1(200); # Module01のmethod1が呼び出される
print "\n-------------------------------\n";
print ($obj1 + $obj2); # オブジェクト同士の演算は正しく行われない
print "\n\n";
my $obj3 = Module02->new();
my $obj4 = Module02->new();
$obj3->method1(100); # Module02のmethod1が呼び出される
$obj4->method1(200); # Module02のmethod1が呼び出される
print "\n-------------------------------\n";
print ($obj3 + $obj4); # オーバーロードすることで対応可能
print "\n";
print ($obj3 + 50); # オーバーロードすることで対応可能
print "\n";
print (50 + $obj4); # オーバーロードすることで対応可能
print "\n";
# 処理開始
BEGIN {
print "test-script-start\n";
}
# 処理終了
END {
print "test-script-end\n";
}
実行結果
>perl sample.pl
test-script-start
Module01:test-constract
Module01:test-constract
Module01:test-method1
Module01:test-method1
-------------------------------
11081496
Module02:test-constract
Module02:test-constract
Module02:test-method1
Module02:test-method1
-------------------------------
300
150
250
Module02:test-descract
Module02:test-descract
Module01:test-descract
Module01:test-descract
test-script-end
>
最終更新:2012年01月15日 10:09