我在Moose类中有一个类属性,但我希望它在覆盖父类值的子类方面像
Class::Data::Inheritable一样工作.也就是说,子类继承父级的值,直到在子类上调用setter,此时值变为不同.例如
#!/usr/bin/perl use warnings; use strict; { package Foo; use Moose; use MooseX::ClassAttribute; class_has Item => ( is => 'rw' ); } { package Bar; use Moose; extends 'Foo'; } Foo->Item(4); # This prints "4,4" as expected # print join( ",",Foo->Item(),Bar->Item() ) . "\n"; Bar->Item(5); # Would like this to print "4,5",but it prints "5,5" # print join( ",Bar->Item() ) . "\n";
获得此效果的最佳方法是什么,使用MooseX::ClassAttribute还是其他方式?对于任何希望从中继承的类数据而言,这似乎是理想的行为.
解决方法
我知道你要求继承,但可能是角色可以帮助你以不同的方式解决你的问题.
试着用一个简单的例子:
#!/usr/local/bin/perl use strict; use feature 'say'; { package Bomb; use Moose::Role; sub fuse { say "Bomb explode" } sub explode { say "Bomb fuse"} } { package Spouse; use Moose::Role; sub fuse { say "Spouse explode"} sub explode { say "Spouse fuse"} } { package PracticalJoke; use Moose; with 'Bomb' => { excludes => 'explode' },'Spouse' => { excludes => 'fuse' }; } my $joke = PracticalJoke->new(); $joke->fuse(); $joke->explode();
通过“排除”,您可以准确控制应该发生的事情.
看看why roles are awsome
以及来自Ovid的幻灯片约inheritance versus roles.