1

mixin我不知道和mixin::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';
4

1 回答 1

2

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

但还要注意,mixin::with 的文档建议“请考虑使用特征而不是 mixin。请参阅 Class::Trait 以获取实现。” 反过来,Class::Trait 已被弃用,建议使用 Moose::Role。

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

于 2013-03-19T14:55:12.423 回答