使用 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 位于继承链的底部。