有没有一种标准的方法可以从Perl超类中有选择地继承方法?

Ric*_*ões 2 oop perl inheritance

或者:是否有一种标准的方法来创建子类但是从超类中获取某些方法会在调用时产生"无法定位对象方法"错误?

例如,如果My::Foo继承自My::Bar,并且My::Bar有一个dostuff调用的方法,则调用Foo->new->dostuff将以某种非人为/ hackish方式使用"无法定位对象方法"错误.

mat*_*ull 5

如果超类是Moose类,则可以使用remove_method.

package My::Foo;
use Moose;
extends 'My::Bar';

# some code here

my $method_name = 'method_to_remove';

__PACKAGE__->meta->remove_method($method_name);

1;
Run Code Online (Sandbox Code Playgroud)

这在Class :: MOP :: Class中有记录,应该与MooseX :: NonMoose一起使用,但我不确定.


Eri*_*rom 5

您可以在子类中创建拦截方法调用和死亡的伪方法.

package My::Foo;
our @ISA = 'My::Bar';
use Carp ();

for my $method qw(dostuff ...) {
    no strict 'refs';
    *$method = sub {Carp::croak "no method '$method' on '$_[0]'"};
}   
Run Code Online (Sandbox Code Playgroud)

您甚至可以编写一个模块来执行此操作:

package No::Method;
use Carp ();
sub import {
    my $class = shift;
    my $caller = caller;

    for my $method (@_) {
        no strict 'refs';
        *{"$caller\::$method"} = sub {
              Carp::croak "no method '$method' on '$_[0]'"
         };
    }
}  
Run Code Online (Sandbox Code Playgroud)

然后使用它:

package My::Foo;
our @ISA = 'My::Bar';
use No::Method qw(dostuff);
Run Code Online (Sandbox Code Playgroud)