为什么 Moose Role 方法会覆盖 parents 定义?
Why a Moose Role method overrides parents definition?
方法 a
在 A
和 A::B
中定义。
C
派生自 A
并使用 A::B
.
问题 1:为什么 A::B->a
覆盖 A->a
?
$ perl x.pl
b
问题 2:如果我们将 sub a {'c'}
添加到 C
,为什么 A::B->a
不会覆盖 C->a
?
A.pm: 基础 class
package A;
use Moose;
sub a {
return 'a';
}
no Moose;
1;
A/B.pm: 一个角色
package A::B;
use Moose::Role;
sub a {
return 'b';
}
1;
C.pm:派生自 A 的 class,角色为 A::B
package C;
use Moose;
extends "A";
with "A::B";
no Moose;
1;
bin.pl
use v5.10;
use strict;
use warnings;
use C;
my $c = C->new();
say $c->a;
package C;
use Moose;
extends 'A';
使包 C
成为 A
的子类。在幕后,它将 A
添加到 @C::ISA
。当类型 C
的对象调用方法并且在名称空间 C
中找不到方法名称时,perl 将检查 @C::ISA
中的名称空间以寻找解析方法名称的方法。
package C;
use Moose;
with 'A::B';
做一些不同的事情。它不会使 C
成为 A::B
的子类。它将条目从 A::B
命名空间复制到 C
命名空间。
因此,当您调用 $c->a
时,Perl 会找到一个子例程 &C::a
,因为它是从 &A::B::a
复制而来的,这就是它所使用的。它不需要遍历 @C::ISA
来搜索另一个名为 a
.
的子例程
如果你在package C
中也定义了一个sub a { ... }
,那么use Moose ... with 'A::B'
将不会覆盖它。
方法 a
在 A
和 A::B
中定义。
C
派生自 A
并使用 A::B
.
问题 1:为什么 A::B->a
覆盖 A->a
?
$ perl x.pl
b
问题 2:如果我们将 sub a {'c'}
添加到 C
,为什么 A::B->a
不会覆盖 C->a
?
A.pm: 基础 class
package A;
use Moose;
sub a {
return 'a';
}
no Moose;
1;
A/B.pm: 一个角色
package A::B;
use Moose::Role;
sub a {
return 'b';
}
1;
C.pm:派生自 A 的 class,角色为 A::B
package C;
use Moose;
extends "A";
with "A::B";
no Moose;
1;
bin.pl
use v5.10;
use strict;
use warnings;
use C;
my $c = C->new();
say $c->a;
package C;
use Moose;
extends 'A';
使包 C
成为 A
的子类。在幕后,它将 A
添加到 @C::ISA
。当类型 C
的对象调用方法并且在名称空间 C
中找不到方法名称时,perl 将检查 @C::ISA
中的名称空间以寻找解析方法名称的方法。
package C;
use Moose;
with 'A::B';
做一些不同的事情。它不会使 C
成为 A::B
的子类。它将条目从 A::B
命名空间复制到 C
命名空间。
因此,当您调用 $c->a
时,Perl 会找到一个子例程 &C::a
,因为它是从 &A::B::a
复制而来的,这就是它所使用的。它不需要遍历 @C::ISA
来搜索另一个名为 a
.
如果你在package C
中也定义了一个sub a { ... }
,那么use Moose ... with 'A::B'
将不会覆盖它。