多重継承
複数のモジュールを継承できる
イメージ
'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;
# コンストラクタ
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\n";
}
# インスタンスメソッド
sub method2{
my $obj = shift;
print "Module02:test-method2\n";
}
# デストラクタ
sub DESTROY {
# オブジェクトを取得
my $obj = shift;
# 処理
print "Module02:test-descract\n";
}
# モジュール終端
1;
'work/Module12.pm'
# パッケージ名定義
package Module12;
# 継承元のモジュールを定義
use work::Module02;
# 継承するモジュール名を設定
our @ISA = qw(Module02);
# コンストラクタ
sub new {
# オブジェクトを取得
my $class = shift;
print "Module12:test-constract\n";
# リファレンス
my $ref = {};
# オブジェクト生成
my $obj = bless $ref, $class;
# オブジェクト返却
return $obj;
}
# インスタンスメソッド
sub method1{
my $obj = shift;
print "Module12:test-method1\n";
}
# インスタンスメソッド
sub method2{
my $obj = shift;
print "Module12:test-method2(override)\n";
}
# デストラクタ
sub DESTROY {
# オブジェクトを取得
my $obj = shift;
# 処理
print "Module12:test-descract\n";
}
# モジュール終端
1;
'work/Module20.pm'
# パッケージ名定義
package Module20;
# 継承元のモジュールを定義
use work::Module01;
use work::Module12;
# 継承するモジュール名を設定
our @ISA = qw(Module01 Module12);
# コンストラクタ
sub new {
# オブジェクトを取得
my $class = shift;
print "Module20:test-constract\n";
# リファレンス
my $ref = {};
# オブジェクト生成
my $obj = bless $ref, $class;
# オブジェクト返却
return $obj;
}
# インスタンスメソッド
sub method3{
my $obj = shift;
print "Module20:test-method3\n";
}
# デストラクタ
sub DESTROY {
# オブジェクトを取得
my $obj = shift;
# 処理
print "Module20:test-descract\n";
}
# モジュール終端
1;
'sample.pl'
# プラグマ
use strict;
use warnings;
# モジュール取り込み
use work::Module20;
# メインスクリプト
my $obj = Module20->new();
$obj->method1(); # Module01のmethod1が呼び出される
$obj->Module12::method1(); # Module12のmethod1が呼び出される
$obj->method2(); # Module12のmethod2が呼び出される
$obj->method3(); # Module20のmethod3が呼び出される
# 処理開始
BEGIN {
print "test-script-start\n";
}
# 処理終了
END {
print "test-script-end\n";
}
実行結果
>perl sample.pl
test-script-start
Module20:test-constract
Module01:test-method1
Module12:test-method1
Module12:test-method2(override)
Module20:test-method3
Module20:test-descract
test-script-end
>
最終更新:2012年01月15日 08:38