我有一个具有以下属性的Moose对象:
has 'people' => (
is => 'ro',
isa => 'ArrayRef[Person::Child]',
traits => ['Array'],
default => sub { [] },
handles => {
all_people => 'elements',
get_people => 'get',
push_people => 'push',
pop_people => 'pop',
count_people => 'count',
sort_people => 'sort',
grep_people => 'grep',
},
);
请注意 isa
设置为'ArrayRef[Person::Child]' .
我希望能够在创建我的对象时在 Person::Child
,_1793115等之间进行选择 . 这是可能的还是我必须创建除 people
属性的 isa
之外相同的不同对象?
(这让我想起了Java generics) .
2 回答
为什么不将该属性的定义移动到角色中并使用适当的参数化在其他类中重用它?
在其他地方,在实际需要该属性的类中
要么
这样你就不会在两个地方维护属性,并且最终不会得到相同类但具有不同API的对象,这往往是一个相当大的代码味道 .
或者,您可以简单地编写
ArrayRef
的子类型,该子类型接受Person::Child
或Person::Adult
的列表或您拥有的任何其他类型的人员,但只要该列表的所有元素属于同一类型 .我可能会选择第一个解决方案,以便能够根据对象类决定它是否包含儿童,成人或其他任何东西 .
如果你喜欢Java,你可能会喜欢这个:
确认Person :: Adult和Person :: Child实现此接口:
和
回到主要 class :
现在只有实现Interfaces :: Person接口的类才能添加到'people' .