我正在尝试实现一个Moose :: Role类,其行为类似于Java中的抽象类.我想在Role中实现一些方法,但是能够在具体类中覆盖这些方法.如果我尝试使用与扩展类时相同的样式,我会得到错误Cannot add an override method if a local method is already present.这是一个例子:
我的抽象类:
package AbstractClass;
use Moose::Role;
sub my_ac_sub {
my $self = shift;
print "In AbstractClass!\n";
return;
}
1;
Run Code Online (Sandbox Code Playgroud)
我的具体课程:
package Class;
use Moose;
with 'AbstractClass';
override 'my_ac_sub' => sub {
my $self = shift;
super;
print "In Class!\n";
return;
};
__PACKAGE__->meta->make_immutable;
1;
Run Code Online (Sandbox Code Playgroud)
然后:
use Class;
my $class = Class->new;
$class->my_ac_sub;
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我想要完成的是应该以不同的方式完成的吗?我不想做什么?
原来是我使用方式不对。我开了一张票,并看到了正确的操作方法:
package Class;
use Moose;
with 'AbstractClass';
around 'my_ac_sub' => sub {
my $next = shift;
my $self = shift;
$self->$next();
print "In Class!\n";
return;
};
__PACKAGE__->meta->make_immutable;
1;
Run Code Online (Sandbox Code Playgroud)
做出这样的改变就达到了预期的效果。