【发布时间】:2017-04-12 06:26:36
【问题描述】:
我在 perl 中有一个包,它使用另外两个包作为其基础。
父母1:
package Parent1;
use strict;
use warnings;
sub foo
{
my $self = shift;
print ("\n Foo from Parent 1 ");
$self->baz();
}
sub baz
{
my $self = shift;
print ("\n Baz from Parent 1 ");
}
1;
父母 2:
package Parent2;
use strict;
use warnings;
sub foo
{
my $self = shift;
print ("\n Foo from Parent 2 ");
$self->baz();
}
sub baz
{
my $self = shift;
print ("\n Baz from Parent 2 ");
}
1;
孩子: 这里用到了上面两个父包。
package Child;
use strict;
use warnings;
use base qw(Parent1);
use base qw(Parent2);
sub new
{
my $class = shift;
my $object = {};
bless $object,$class;
return $object;
}
1;
主要:
use strict;
use warnings;
use Child;
my $childObj = new Child;
$childObj->Parent2::foo();
输出:
Foo from Parent 2
Baz from Parent 1
我的分析:
从输出中可以清楚地看出,子对象被传递给 parent2 的 foo 方法,并且从该 foo 方法中,它正在调用 baz 方法。它首先检查 Child 包中的 baz 方法,因为我用子对象调用它。由于 baz 方法不在子包中,它会检查基类中的方法。 Parent1 是 Child 的第一个基类。于是,它找到了Parent1中的方法,并调用了Parent1的baz方法。
我的问题:
是否可以在不改变child中基类顺序的情况下调用Parent2的baz方法?
我的预期输出:
Foo from Parent 2
Baz from Parent 2
上面的例子只是我实际问题的一个类比。我无权修改基类。我只能修改 Child 类。那么,是否可以更改子类,使其从 Parent2 中获取两种方法而不更改基类的顺序?
谢谢!
【问题讨论】:
标签: perl inheritance package subroutine