Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带Moo的Perl:如何调用超类&x27;什么是方法的实现?_Perl_Oop_Moo - Fatal编程技术网

带Moo的Perl:如何调用超类&x27;什么是方法的实现?

带Moo的Perl:如何调用超类&x27;什么是方法的实现?,perl,oop,moo,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 an

我有一个类
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中实现这一点?

这可以通过Perl方法解析系统的一部分在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和祖父母中调用
foo

指出:

不支持
super
override
internal
augment
-作者认为augment是个坏主意,可以翻译
override

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


Re“Moo和Moose都支持这个”,这是Perl方法调度的一部分,所以它总是可用的。感谢您的帮助。不幸的是,这对我不起作用,我也不完全确定为什么……是的!谢谢,这正是我需要的!医生在这方面太糟糕了。我想我以前需要使用
,但即使这样,我也不知道该怎么做!再次感谢你的帮助。完美
#!/usr/bin/env perl

use strict;
use warnings;

package X;

use Moo;

sub calculate {
    return 'Hello!'
}


package Y;

use Moo;

extends 'X';

around calculate => sub {
    my $orig = shift;
    my $self = shift;

    if ( $_[0] > 5 ) {
        return $self->$orig(@_);
    }

    return 'Goodbye!';
};

package main;

my $y = Y->new;

print $y->calculate(3), "\n";
print $y->calculate(11), "\n";