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

caj*_*ine 5 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;
}
Run Code Online (Sandbox Code Playgroud)

runnig代码给出:

func from Some
func from Over
func from Plain
Run Code Online (Sandbox Code Playgroud)

例如,func在两种情况下都重新定义了该方法,没有任何警告等.

问题:

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

ike*_*ami 5

文件完全回答了这个.

override ($name, &sub)

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