【发布时间】:2012-03-22 15:42:50
【问题描述】:
我在 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( ", ", Foo->Item(), Bar->Item() ) . "\n";
使用MooseX::ClassAttribute 或其他方式获得这种效果的最佳方法是什么?对于期望从中继承的任何带有类数据的类来说,这似乎是理想的行为。
【问题讨论】:
-
FWIW Class::Data::Inheritable 与 Moose 不冲突。
-
Schwern:这可能是真的,虽然 Moose 对象必须从 Moose::Object 继承,所以至少会涉及到多重继承,这让我很困扰。你也没有得到 MooseX::ClassAttribute 给你的任何 Moose 属性声明优点。