{
package MyClass;
# コンストラクタ
sub new {
bless {}, shift;
}
# デストラクタ
sub DESTROY {
my $self = shift;
print "Destruction.\n";
$self->SUPER::DESTROY; # 親クラスの DESTROY を呼び出す
}
}
my $obj = MyClass->new;
あるオブジェクト $obj
のリファレンスカウンタが 0 になり、オブジェクトが破棄されるとき、
$obj->DESTROY;
が呼び出されます。オブジェクトが使用していた一時ファイルなどを削除する場合は、DESTROY
メソッドの中で後始末を行うことができます。
MyClass
クラスが Base
クラスを継承しているようなケースでは、Base
クラスの DESTROY
メソッドが正しく呼び出されるようにするために、MyClass::DESTROY
メソッド内で明示的に Base::DESTROY
メソッドを呼んでやる必要があります。
親クラスのメソッドを呼び出すには、明示的なクラス名を指定する代わりに、SUPER
キーワードを使用できます。
our @ISA = qw(Base);
sub DESTROY {
$self = shift;
# ...
$self->SUPER::DESTROY; # Base::DESTROY を呼び出す
}
基底クラスがまだ存在しない場合でも、デストラクタには必ず $self->SUPER::DESTROY
を含めることが推奨されています(『続・初めての Perl』より)。
ただし、SUPER::DESTORY
は、継承しているクラスの中で最初に見つかった DESTROY
メソッドしか実行してくれないので、多重継承をしている場合は明示的にすべての親クラスの DESTROY
メソッドを呼び出さないといけないようです。
our @ISA = qw(Base1 Base2);
sub DESTROY {
my $self = shift;
# ...
$self->Base1::DESTROY;
$self->Base2::DESTROY;
}