如何实现每个子类不同的类常量?

时间:2014-12-17 00:43:32

标签: moose

在我的类层次结构中,我需要一个公共属性,其中每个子类需要提供一个不同的值,该值对于该类的所有对象都是常量。 (此属性用作我镜像的现有层次结构的关键 - 不是最好的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',每个具体类都必须提供,除了这使我失去了属性路由的类型约束。

1 个答案:

答案 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';