0

Parent::call_foo() が呼び出されると、$self が祝福された親であるか祝福された子であるかに関係なく、また Child が foo() をオーバーロードしているという事実に関係なく、常に Parent::foo() を呼び出すようにします。

このコードは次を出力します。

parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, child foo

しかし、私はそれを印刷したい:(最後の行の親foo)

parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, parent foo

-

use Parent;
use Child;

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

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

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

-

package Parent;

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

sub foo {
    print "parent foo\n";
}

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

-

package Child;
use base qw(Parent);

sub foo {
    print "child foo\n";
}

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

1 に答える 1

1

親のでは、メソッドではなくサブルーチンとしてcall_foo呼び出すだけです。fooそれは常に親バージョンを呼び出します。

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()、通常のメソッド検索を行いますが、Parent クラスから開始することです (つまり、Parent が実際にそのfooメソッドを基本クラスから継承した場合に機能します)。が Parent クラスに存在することがわかっているのでfoo、直接呼び出すことでメソッド ルックアップのコストを節約できます。

于 2013-10-16T19:11:04.830 に答える