使用“覆盖”或只是简单地重新定义perl中的子例程

时间:2016-04-16 18:21:45

标签: perl

拥有此示例代码 - 扩展Some包并重新定义func方法的2个包。

use 5.014;
use warnings;

package Some {
    use Moose;
    use warnings;
    sub func { say 'func from Some'; }
}

package Over {
    use Moose;
    use warnings;
    extends 'Some';
    override 'func' => sub { say 'func from Over'; };
}

package Plain {
    use Moose;
    use warnings;
    extends 'Some';
    sub func { say 'func from Plain'; };
}

#main
for my $package ( qw(Some Over Plain) ) {
    my $instance = $package->new();
    $instance->func;
}

运行代码给出:

func from Some
func from Over
func from Plain

e.g。 func方法在两种情况下都被重新定义,没有任何警告等。

问题:

  • 这两种方式之间存在一些有意义的差异吗?
  • 什么时候应该使用override plain 何时重新定义?
  • 这是在一些文档中讨论的吗?

1 个答案:

答案 0 :(得分:5)

documentation完美地回答了这个问题。

  

override ($name, &sub)

     

覆盖方法是一种明确说出的方式"我从我的超类"中覆盖了这个方法。您可以在此方法中调用super,它将按预期工作。使用普通方法调用和SUPER::伪包可以完成同样的事情;这真的是你的选择。