使用 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 位於繼承鏈的底部。