【发布时间】:2017-08-10 15:29:24
【问题描述】:
我正在尝试在 Perl 中使用多重继承,但我不知道如何从子构造函数中调用多个父构造函数。
下午:
package A;
use Carp qw (croak);
use strict;
use warnings;
sub new {
my $class = shift;
print "This is A new\n";
my $self->{DEV_TYPE} = shift || "A";
bless($self, $class);
return $self;
}
sub a_func{
print "This is A func\n";
}
1;
下午:
package B;
use Carp qw (croak);
use strict;
use warnings;
sub new {
my $class = shift;
print "This is B new\n";
my $self->{DEV_TYPE} = shift || "B";
bless($self, $class);
return $self;
}
sub b_func{
print "This is B func\n";
}
1;
下午:
package C;
use Carp qw (croak);
use strict;
use warnings;
eval "use A";
die $@ if $@;
eval "use B";
die $@ if $@;
our @ISA = ("A","B");
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
print "This is C new\n";
$self->{DEV_TYPE} = shift || "C";
bless($self, $class);
return $self;
}
sub c_func{
print "This is C func\n";
}
1;
在C::new 中,$class->SUPER::new 不会调用 B 的构造函数。如果我使用 $class->B::new(@_); 显式调用它,则会收到错误消息
在 C.pm 中无法通过包“B”定位对象方法“new”
我做错了什么?
【问题讨论】:
-
$class->SUPER::new(@_)只会选择@ISA中的一项,否则它需要返回一组对象引用(一个引用用于A->new(),一个引用用于B->new()) -
您可以强制它使用
my $selfB = do { local @ISA = ("B"); $class->SUPER::new(@_) };调用B类构造函数,但我不知道这是否是个好主意