如果您的构造函数所做的只是调用父构造函数(如在您的示例中,您根本不需要编写一个。只需将其省略即可调用父构造函数;您只需要确保对象被祝福到正确的类型:
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 的属性合并到子类中,然后最终将生成的对象祝福到 Child 类中。这种复杂性是多重继承是一个糟糕的设计选择的众多原因之一。您是否考虑过重新设计对象层次结构,可能通过将一些属性移动到角色中?此外,您可能希望使用对象框架来完成一些繁忙的工作,例如Moose。现在很少需要编写自定义构造函数。
(最后,您应该避免使用变量$a
和$b
;它们在 Perl 中的处理方式不同,因为它们是排序函数和其他一些内置函数中使用的变量。)