perl - 行为类似于 Class::Data::Inheritable 的 Moose 类属性

标签 perl moose

我在 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否则?对于任何希望从其继承的具有类数据的类来说,这似乎是可取的行为。

最佳答案

我知道您要求继承,但角色可能会帮助您以不同的方式解决问题。

用一个简单的例子试试:

#!/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 的幻灯片.

关于perl - 行为类似于 Class::Data::Inheritable 的 Moose 类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9562071/

相关文章:

perl - 如何为遗留系统创建构建?

python - python 或 perl 中的正则表达式脚本

perl - Moose:在 BUILD 方法中从文件加载对象

perl - 测试 Moose 和 MooseX::FollowPBP 生成的方法需要多少钱?

javascript - 如何在 perl 中执行页面的 javascript 函数?

perl - 在Perl中使用expect,如何用$object->expect()方法添加忽略大小写的选项?

perl - 如何在Moose中使用单个构建器构建多个属性?

Perl/Moose 不会创建对象,但如果属性错误也不会死亡

perl - 初始化后应该如何定义 Moose 对象子例程?

perl - MooseX::NonMoose 类中的混合问题