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

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

概述我在Moose类中有一个类属性,但我希望它在覆盖父类值的子类方面像 Class::Data::Inheritable一样工作.也就是说,子类继承父级的值,直到在子类上调用setter,此时值变为不同.例如 #!/usr/bin/perluse warnings;use strict;{ package Foo; use Moose; use MooseX::Clas 我在Moose类中有一个类属性,但我希望它在覆盖父类值的子类方面像 Class::Data::Inheritable一样工作.也就是说,子类继承父级的值,直到在子类上调用setter,此时值变为不同.例如

#!/usr/bin/perluse 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/perluse 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 – Moose类属性,其作用类似于Class :: Data :: Inheritable全部内容,希望文章能够帮你解决perl – Moose类属性,其作用类似于Class :: Data :: Inheritable所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1269267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存