使用 Moose 编程/语法/extends
外观
< 使用 Moose 编程 | 语法
使用 extends
关键字覆盖继承链,只设置您指定的那些部分。Extends 既消除了问题也带来了问题,应该经常使用,但在从非 Moose 迁移到 Moose 时要谨慎使用。
使用 extends
时要注意的一点是使用 use base
。CORE 模块“base”不会覆盖(重写)继承链,而是向其添加内容。Moose 的作者 Steven 将此识别为问题区域,即使某些功能有时依赖于“问题”。Extends 强制线性继承链(除非另有指定),这意味着链中的最后一个模块必须通过定义要么 use Moose
,要么 push @ISA,'Moose::Object'
。如果这两个条件都不满足,您将收到混淆的错误,告诉您关键字(纯 Perl5 函数)未定义。
对 use Moose
的指令指示 Moose 自动将 @ISA
设置为从 Moose::Object
继承。@ISA
被 extends
的使用覆盖。
module A - module B - module C
- A extends B
- B extends C
- C 必须要么
use Moose
,要么use base 'Moose::Object'
extends
问题的罪魁祸首通常是 Class::Accessor
,或者 Moose 团队所称的遗留垃圾。Class::Accessor
通常在基类中使用,如下所示
use base qw/Class::Accessor/;
BEGIN { Class::Accessor::mk_accessors( qw/ foo bar baz / ) };
这会导致将 Class::Accesssor
推送到 @ISA
(继承链)上,但它仍然将 Moose 排除在外。Moose 期望 Moose::Object
位于继承链的底部。