コンストラクターが実行しているのは親コンストラクターの呼び出しだけである場合 (例のように、作成する必要はまったくありません。単純に省略して親が呼び出されます。オブジェクトが bless されていることを確認するだけで済みます。正しいタイプ:
package Parent;
use strict;
use warnings;
sub new
{
my ($class, @args) = @_;
# do something with @args
return bless {}, $class;
}
1;
上記のコードを使用してChild
クラスを宣言するとuse parent 'Parent';
、Parent コンストラクターは適切に子を構築します。
子にいくつかのプロパティを追加する必要がある場合、あなたが持っていたものはほとんど正しいです:
package Child;
use strict;
use warnings;
use parent 'Parent';
sub new
{
my ($class, @args) = @_;
# possibly call Parent->new(@args) first
my $self = $class->SUPER::new(@args);
# do something else with @args
# no need to rebless $self, if the Parent already blessed properly
return $self;
}
1;
ただし、複数の継承を混在させる場合は、すべての段階で適切な処理を決定する必要があります。これは、Parent1 と Parent2 のプロパティを子にマージする方法を決定し、最終的に結果のオブジェクトを Child クラスに祝福する、すべてのクラスのカスタム コンストラクタを意味します。この複雑さは、多重継承が不適切な設計選択である多くの理由の 1 つです。おそらくいくつかのプロパティをロールに移動することによって、オブジェクト階層を再設計することを検討しましたか? さらに、Mooseなどの忙しい作業の一部を取り除くために、オブジェクト フレームワークを採用することもできます。現在、カスタム コンストラクターを記述する必要はほとんどありません。
$a
(最後に、変数との使用は避けるべき$b
です。これらは、並べ替え関数やその他の組み込み関数で使用される変数であるため、Perl では異なる方法で扱われます。)