Если все, что делает ваш конструктор, это вызывает родительский конструктор (как в вашем примере, вам вообще не нужно его писать. Просто оставьте его и родительский вызов будет вызван; вам просто нужно убедиться, что объект благословен на правильный тип:
package Parent;
use strict;
use warnings;
sub new
{
my ($class, @args) = @_;
# do something with @args
return bless {}, $class;
}
1;
Если вы используете приведенный выше код и класс Child
объявлен с use parent 'Parent';
, то конструктор Parent будет правильно создавать дочерний.
Если вам нужно добавить некоторые свойства в Child, то, что у вас было, в основном правильно:
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 в дочерний, а затем, наконец, благословляет получившийся объект в дочерний класс. Это осложнение является одной из многих причин, почему множественное наследование является плохим выбором дизайна. Рассматривали ли вы перестройку иерархии объектов, возможно, путем перемещения некоторых свойств в роли? Кроме того, вы можете использовать объектную инфраструктуру для выполнения некоторой занятой работы, например Moose . В настоящее время редко требуется написать собственный конструктор.
(Наконец, вам следует избегать использования переменных $a
и $b
; они обрабатываются по-разному в Perl, поскольку они являются переменными, используемыми в функциях сортировки и некоторых других встроенных модулях.)