【问题标题】:In Perl/Moose, how can I apply a modifier to a method in all subclasses?在 Perl/Moose 中,如何将修饰符应用于所有子类中的方法?
【发布时间】:2011-06-25 07:28:33
【问题描述】:

我有一个打算被子类化的 Moose 类,每个子类都必须实现一个“执行”方法。但是,我想将应用方法修饰符应用于我的类中的执行方法,以便它适用于所有子类中的执行方法。但是当方法被覆盖时,方法修饰符不会被保留。有什么方法可以确保我的类的所有子类都将我的方法修饰符应用于它们的执行方法?

示例:在超类中,我有这个:

before execute => sub {
    print "Before modifier is executing.\n"
}

然后,在它的子类中:

sub execute {
    print "Execute method is running.\n"
}

当调用execute方法时,它没有说任何关于“before”修饰符的内容。

【问题讨论】:

    标签: perl inheritance methods moose method-modifier


    【解决方案1】:

    这就是 augment 方法修饰符的用途。你可以把它放在你的超类中:

    sub execute {
      print "This runs before the subclass code";
      inner();
      print "This runs after the subclass code";
    }
    

    然后,不要让您的子类直接覆盖execute,而是让它们augment 它:

    augment 'execute' => sub {
      print "This is the subclass method";
    };
    

    基本上,它为您提供类似于 around 修饰符的功能,除了更改了父/子关系。

    【讨论】:

    • 嗯。我忘了提到我的超类实际上继承自另一个非 Moose 类,该类期望其子类声明一个执行方法,因此增强/内部将不起作用。但我同意这是一般的解决方案。至于我的具体问题,我发现我可以简单地将修饰符放在 calls 执行的方法上,因为该方法永远不会在子类中重新定义或覆盖。所以我想我会接受这个。
    • @Ryan Thompson,我还没有尝试过,我认为你可以在你的父母和孩子之间放置一个几乎空的 Moose 课程。然后将hobbs' 执行方法放入您的Moose 适配器类,继承其他所有内容,然后就可以了。 警告:昏昏欲睡的人的未经测试、未经尝试、经过深思熟虑的胡言乱语——使用时要格外小心。
    • @Ryan 但超类确实声明了一个执行方法,并且它该类的子类,期望其子类声明一个执行方法,所以所有的都是带有增强/内部的犹太洁食。在树中实际添加方法的位置应该无关紧要。
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2012-08-11
    • 2013-09-02
    • 2018-02-10
    • 2013-02-02
    • 2010-12-14
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多