perl – Moose类属性,其作用类似于Class :: Data :: Inheritable

前端之家收集整理的这篇文章主要介绍了perl – Moose类属性,其作用类似于Class :: Data :: Inheritable前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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.

猜你在找的Perl相关文章