从Perl中的类构造函数调用基础构造函数的正确方法是什么?
我看到这样的语法:
my $class = shift; my $a = shift; my $b = shift; my $self = $class->SUPER::new($a,$b); return $self;
它是否正确 ?如果我们有几个父类,该怎么办?例如像这样的类:
package Gamma;
use base Alpha;
use base Beta;
sub new
{
# Call base constructors...
}
1;
解决方法
这个问题是为什么有些人建议你不要在你的新方法中做任何有趣的事情。
新的预期会创建并返回一个有福的引用,很难使一个系统处理这两次来自不同父类的同一个对象。
新的预期会创建并返回一个有福的引用,很难使一个系统处理这两次来自不同父类的同一个对象。
一个更清洁的选择是创建一个只创建对象的新方法,并调用可以设置对象的另一种方法。第二种方法可以以允许调用多个父方法的方式表现。有效的新的是你的分配器,这个其他的方法是你的构造函数。
package Mother;
use strict;
use warnings;
sub new {
my ($class,@args) = @_;
my $self = bless {},$class;
return $self->_init(@args);
}
sub _init {
my ($self,@args) = @_;
# do something
return $self;
}
package Father;
use strict;
use warnings;
sub new {
my ($class,@args) = @_;
# do something else
return $self;
}
package Child;
use strict;
use warnings;
use base qw(Mother Father);
sub _init {
my ($self,@args) = @_;
# do any thing that needs to be done before calling base classes
$self->Mother::_init(@args); # Call Mother::_init explicitly,SUPER::_init would also call Mother::_init
$self->Father::_init(@args); # Call Father::_init explicitly,SUPER::_init would NOT call Father::_init
# do any thing that needs to be done after calling base classes
return $self;
}
以太网对您可能通过使用多重继承来找到的并发症是正确的。您仍然需要知道,父:: _ init不会覆盖Mother :: _ init开始的任何决定。它只会变得更复杂,更难从那里进行调试。
我会推荐Moose,它的界面包括一个更好的分离对象的创建和初始化比我上面的例子通常只是工作。