Ric*_*ões 2 oop perl inheritance
或者:是否有一种标准的方法来创建子类但是从超类中获取某些方法会在调用时产生"无法定位对象方法"错误?
例如,如果My::Foo继承自My::Bar,并且My::Bar有一个dostuff调用的方法,则调用Foo->new->dostuff将以某种非人为/ hackish方式使用"无法定位对象方法"错误.
如果超类是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一起使用,但我不确定.
您可以在子类中创建拦截方法调用和死亡的伪方法.
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)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |