mixin模块和mixin :: with perl中的模块有什么区别?

时间:2013-03-19 02:56:14

标签: perl mixing

我不知道mixinmixin::with模块之间有什么区别?

package Dog;
sub speak { print "Bark!\n" }
sub new { my $class = shift;  bless {}, $class }

package Dog::Small;
use base 'Dog';
sub speak { print "Yip!\n"; }

package Dog::Retriever;
use mixin::with 'Dog';
sub fetch { print "Get your own stinking $_[1]\n" }

package Dog::Small::Retriever;
use base 'Dog::Small';
use mixin 'Dog::Retriever';

my $small_retriever = Dog::Small::Retriever->new;
$small_retriever->speak;          # Yip!
$small_retriever->fetch('ball');  # Get your own stinking ball

在上面的代码中,可以使用以下代码:

package Dog::Small::Retriever;
use base 'Dog::Small';
use mixin 'Dog::Retriever';

替换为以下一个?

package Dog::Small::Retriever;
#use base 'Dog::Small';
use mixin:with 'Dog::Retriever';

1 个答案:

答案 0 :(得分:2)

看起来mixin :: with旨在用于定义添加/更改行为的类(在您的示例中为Dog :: Small和Dog :: Retriever),而mixin用于最终消费类(Dog: :小猎犬::)

但是请注意documentation for mixin::with建议“不要使用mixins,请考虑使用traits。请参阅Class :: Trait进行实现。”反过来,Class :: Trait已被弃用,并建议使用Moose :: Role。

哦 - 您不能跳过use base 'Dog::Small'声明 - 如果您这样做,您的课程将不会继承Dog::Small(或Dog)。