我有一个类X
,其子类为Y
。 X
有一个方法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中执行此操作?
答案 0 :(得分:2)
正如docs指出:
不支持
super
,override
,inner
或augment
- 作者认为补充是一个坏主意, {{ 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
。