継承

モジュールから別モジュールの処理を引き継ぐ

'work/Module01.pm'

# パッケージ名定義
package Module01;
 
# コンストラクタ
sub new {
	# オブジェクトを取得
	my $class = shift;
 
	print "Module01:test-constract\n";
 
	# リファレンス
	my $ref = {};
 
	# オブジェクト生成
	my $obj = bless $ref, $class;
 
	# オブジェクト返却
	return $obj;
}
 
 
# インスタンスメソッド
sub method1{
	my $obj = shift;
 
	print "Module01:test-method1\n";
 
}
 
# デストラクタ
sub DESTROY {
	# オブジェクトを取得
	my $obj = shift;
 
	# 処理
	print "Module01:test-descract\n";
 
}
 
# モジュール終端
1;
 
 

'work/Module02.pm'

# パッケージ名定義
package Module02;
 
# 継承元のモジュールを定義
use work::Module01;
 
# 継承するモジュール名を設定
our @ISA = qw(Module01);
 
 
# コンストラクタ
sub new {
	# オブジェクトを取得
	my $class = shift;
 
	print "Module02:test-constract\n";
 
	# リファレンス
	my $ref = {};
 
	# オブジェクト生成
	my $obj = bless $ref, $class;
 
	# オブジェクト返却
	return $obj;
}
 
 
# インスタンスメソッド
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::Module02;
 
# メインスクリプト
my $obj = Module02->new();
$obj->method1();  # Module01のmethod1が呼び出される
$obj->method2();
 
# 処理開始
BEGIN {
	print "test-script-start\n";
}
 
# 処理終了
END {
	print "test-script-end\n";
}
 
 

実行結果

>perl sample.pl
test-script-start
Module02:test-constract
Module01:test-method1
Module02:test-method2
Module02:test-descract
test-script-end
 
>
 
 


オーバーライド(継承元のメソッドを上書き)

'work/Module01.pm'

# パッケージ名定義
package Module01;
 
# コンストラクタ
sub new {
	# オブジェクトを取得
	my $class = shift;
 
	print "Module01:test-constract\n";
 
	# リファレンス
	my $ref = {};
 
	# オブジェクト生成
	my $obj = bless $ref, $class;
 
	# オブジェクト返却
	return $obj;
}
 
 
# インスタンスメソッド
sub method1{
	my $obj = shift;
 
	print "Module01:test-method1\n";
 
}
 
# デストラクタ
sub DESTROY {
	# オブジェクトを取得
	my $obj = shift;
 
	# 処理
	print "Module01:test-descract\n";
 
}
 
# モジュール終端
1;
 
 

'work/Module02.pm'

# パッケージ名定義
package Module02;
 
# 継承元のモジュールを定義
use work::Module01;
 
# 継承するモジュール名を設定
our @ISA = qw(Module01);
 
 
# コンストラクタ
sub new {
	# オブジェクトを取得
	my $class = shift;
 
	print "Module02:test-constract\n";
 
	# リファレンス
	my $ref = {};
 
	# オブジェクト生成
	my $obj = bless $ref, $class;
 
	# オブジェクト返却
	return $obj;
}
 
# インスタンスメソッド
sub method1{
	my $obj = shift;
 
	print "Module02:test-method1(override)\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::Module02;
 
# メインスクリプト
my $obj = Module02->new();
$obj->Module01::method1();  # Module01のmethod1が呼び出される
$obj->method1();            # Module02のmethod1が呼び出される
$obj->method2();
 
# 処理開始
BEGIN {
	print "test-script-start\n";
}
 
# 処理終了
END {
	print "test-script-end\n";
}
 
 

実行結果

>perl sample.pl
test-script-start
Module02:test-constract
Module01:test-method1
Module02:test-method1(override)
Module02:test-method2
Module02:test-descract
test-script-end
 
>
 
 


多重継承

複数のモジュールからの処理を継承する





最終更新:2012年01月14日 23:53