在我的类层次结构中,我需要一个公共属性,其中每个子类需要提供一个不同的值,该值对于该类的所有对象都是常量。 (此属性用作我镜像的现有层次结构的关键 - 不是最好的OO设计,但我需要保留此链接。)
实现这一点的一种方法是使用属性,如下所示:
package TypeBase;
use Moose::Role;
has type => (
is => 'ro',
isa => enum([qw(A B)]),
builder => '_type',
init_arg => nil,
required => 1,
);
1;
#####
package TypeA;
use Moose;
with 'TypeBase';
sub _type { 'A' };
1;
#####
package TypeB;
use Moose;
with 'TypeBase';
sub _type { 'B' };
1;
有更好的方法吗?我只能在基类中有requires 'type'
,每个具体类都必须提供,除了这使我失去了属性路由的类型约束。
答案 0 :(得分:0)
我的解决方案在外部界面方面与您的解决方案相同。主要区别在于使用constant
来更好地反映您正在做的事情。 (请注意,TYPE仍然可以像方法一样调用。)因为如果使用requires
,如果您没有在其中一个类中实现TYPE,它还应该为您提供编译时而不是运行时错误。
package TypeBase;
use Moose::Role;
requires 'TYPE';
package TypeA;
use Moose;
with 'TypeBase';
use constant TYPE => 'A';
package TypeB;
use Moose;
with 'TypeBase';
use constant TYPE => 'B';