我想實現一個Moose :: Role類,它的行爲就像在Java中的一個抽象類。我想在角色中實現一些方法,但是有能力在具體類中重寫這些方法。如果我使用與擴展類相同的樣式來嘗試此操作,則會收到錯誤Cannot add an override method if a local method is already present
。這裏有一個例子:如何覆蓋Moose :: Role中的子項?
我的抽象類:
package AbstractClass;
use Moose::Role;
sub my_ac_sub {
my $self = shift;
print "In AbstractClass!\n";
return;
}
1;
我的具體類:
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;
然後:
use Class;
my $class = Class->new;
$class->my_ac_sub;
難道我做錯了什麼?我正在努力完成的工作應該以不同的方式完成?我試圖不應該做什麼?
使用抽象類來模擬抽象類!這隻需要你使建設變得不可能(即提供一個會引發錯誤的BUILDALL)。 – amon
可能這樣做的駝鹿方式是在角色中有'需要'my_ac_sub';',而不是'虛擬'方法。 Moose :: Role將會檢查它是否已經用可用的方法組合成一個類, –
我試着運行代碼,然後用'sub my_ac_sub'替換重寫,並突然它按照預期工作。那個「修復」有什麼問題嗎? (免責聲明:我是Moose新手)。 – Dallaylaen