关于Perl:当用super调用一个方法时,如何让我的hash(派生类的)看起来像它的super类?

When invoking a method with SUPER, how can I have my blessed hash (of the derived class) look like its SUPER class?

当调用parent::call_foo()时,我希望它始终调用parent::foo(),不管$self是受祝福的父级还是受祝福的子级,也不管子级是否正在重载foo()。

此代码打印:

1
2
3
4
parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, child foo

但我要打印:(最后一行的父foo)

1
2
3
4
parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, parent foo

-

1
2
3
4
5
6
7
8
9
10
11
use Parent;
use Child;

my $par = Parent->new();
my $chd = Child->new();

$par->foo();
$par->call_foo();

$chd->foo();
$chd->call_foo();

-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Parent;

sub new {
    my $class = shift;
    return bless( {}, $class );
}

sub foo {
    print"parent foo
"
;
}

sub call_foo {
    my $self = shift;
    print"parent call_foo,";
    $self->foo();
}
1;

-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Child;
use base qw(Parent);

sub foo {
    print"child foo
"
;
}

sub call_foo {
    my $self = shift;
    print"child call_foo,";
    $self->SUPER::call_foo();
}
1;

在父级的call_foo中,只需调用foo作为子例程,而不是方法。这将始终调用父版本。

1
2
3
4
5
6
7
package Parent;
...
sub call_foo {
    my $self = shift;
    print"parent call_foo,";
    foo($self); # always calls Parent::foo
}

你也可以用$self->Parent::foo()代替foo($self)。不同的是,$self->Parent::foo()执行正常的方法查找,但从父类开始(即,如果父类实际上从基类继承了其foo方法,它将工作)。由于您知道foo存在于父类中,因此可以通过直接调用它来节省方法查找的成本。