gpt4 book ai didi

perl - 为什么$class->SUPER::new在使用多重继承时不调用所有父类的构造函数?

转载 作者:行者123 更新时间:2023-12-03 18:20:04 24 4
gpt4 key购买 nike

我试图在 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(@_); 显式调用它,我得到错误

Can't locate object method "new" via package "B" at C.pm



我究竟做错了什么?

最佳答案

$class->SUPER::new总是调用A::new因为在 @ISA 中 A 在 B 之前.见 method resolution order在 perlobj 中:

When a class has multiple parents, the method lookup order becomes more complicated.

By default, Perl does a depth-first left-to-right search for a method. That means it starts with the first parent in the @ISA array, and then searches all of its parents, grandparents, etc. If it fails to find the method, it then goes to the next parent in the original class's @ISA array and searches from there.


这意味着 $class->SUPER::new只会调用其中一个父构造函数。如果您在两个父类中都有需要从子类运行的初始化逻辑,请将其移动到单独的方法中,如 this post 中所述。 .

当您明确调用 B::new$class->B::new , 你得到

Can't locate object method "new" via package "B" at C.pm


因为 use B正在加载 core module B而不是你的模块。您应该重命名您的模块。

请注意,最好使用 parent 杂注而不是设置 @ISA手动,例如
use parent qw(Parent1 Parent2);
parent负责加载父模块,因此您可以删除相关的 use声明(顺便说一下,你不应该是 eval ing)。

关于perl - 为什么$class->SUPER::new在使用多重继承时不调用所有父类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42885207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com