演算子のオーバーロード

オブジェクトで演算子をオーバーロードすることでオブジェクト同士の演算を行う

'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