我想在基类中定义一个所有子类都可以读取和写入的“注册表”散列,我如何使用 Moose/Perl 完成此操作?
最佳答案
这是一个使用普通 Perl OO 风格的实现。
您有两个类,BaseClass
和全局变量 $REGISTRY
,以及继承自 BaseClass
的 DerivedClass
。
$REGISTRY
可通过 registry()
方法从任何类实例读取和写入。
#!/usr/bin/env perl
use 5.012;
use strict;
package BaseClass;
our $REGISTRY = {};
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub registry {
my $self = shift;
return $REGISTRY;
}
package DerivedClass;
push our @ISA, 'BaseClass';
package main;
my $base = BaseClass->new;
$base->registry->{ alpha } = 1;
my $derived = DerivedClass->new;
$derived->registry->{ beta } = 2;
say $_, ' -> ', $base->registry->{ $_ } foreach keys %{ $base->registry };
如果你运行这个程序你会得到:
alpha -> 1
beta -> 2
如果您更喜欢全 Moose 解决方案,您应该试试这个:
#!/usr/bin/env perl
use 5.012;
use strict;
package BaseClass;
use Moose;
our $_REGISTRY = {};
has '_REGISTRY' => (
is => 'rw',
isa => 'HashRef',
default => sub { return $_REGISTRY }
);
sub registry {
my $self = shift;
return $self->_REGISTRY;
}
__PACKAGE__->meta->make_immutable;
no Moose;
package DerivedClass;
use Moose;
use base 'BaseClass';
__PACKAGE__->meta->make_immutable;
no Moose;
package main;
my $base = BaseClass->new;
$base->registry->{ alpha } = 1;
my $derived = DerivedClass->new;
$derived->registry->{ beta } = 2;
say $_, ' -> ', $base->registry->{ $_ } foreach keys %{ $base->registry };
它产生与 OO Perl 程序相同的结果。
请注意 _REGISTRY
属性是如何定义的。 Moose 不喜欢将 refs 作为默认值:default => {}
被禁止,您必须将任何引用作为返回值包装在匿名子例程中。
关于perl - 在 Perl/Moose 中,如何在父类中创建可从子类访问的静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7422043/