Perl with Moo:如何调用超类的方法实现?

时间:2017-06-13 21:20:53

标签: perl oop moo

我有一个类X,其子类为YX有一个方法calculate(),我想在Y中覆盖一些额外的行为,if语句,如果失败,则调用X.calculate() 。在Python中,这将通过以下方式完成:

class X(object):
    def calculate(self, my_arg):
        return "Hello!"

class Y(X):
    def calculate(self, my_arg):
        if type(my_arg) is int and my_arg > 5:
            return "Goodbye!"
        return super(Y, self).calculate(my_arg)

如何使用Moo模块在​​Perl中执行此操作?

2 个答案:

答案 0 :(得分:2)

正如docs指出:

  

不支持superoverrideinneraugment - 作者认为补充是一个坏主意, {{ 1}}可以翻译

override
     

(强调我的)

around foo => sub {
  my ($orig, $self) = (shift, shift);
  ...
  $self->$orig(@_);
  ...
};

答案 1 :(得分:0)

这可以通过SUPER:: pseudo-class在Perl中完成,https://play.golang.org/p/_TjQhthHl3是Perl方法解析系统的一部分。你只需把它放在方法调用的前面。它不适用于类方法或函数调用。

use strict;
use warnings;
use feature 'say';

package Foo;
use Moo;

sub frobnicate {
    my $self = shift;
    say "foo";
}

package Bar;
use Moo;
extends 'Foo';

sub frobnicate {
    my $self = shift;
    say "bar";
    $self->SUPER::frobnicate;    
}

package main;
Bar->new->frobnicate;

如果你有多级继承,你甚至可以用它来调用每个父方法。

package Grandparent;
sub foo { ... }

package Parent;
use parent 'Grandparent';
sub foo { $_[0]->SUPER::foo }

package Child;
use parent 'Parent';
sub foo { $_[0]->SUPER::foo }

随后将在Child,Parent和Grandparent中调用foo