2014-02-25 67 views
2

我知道这可能是一个非常简单的主题,但我试图得到最好的逻辑,因为我还是Perl新手。Perl共享变量与子类

如果我不使用面向对象,只是将代码分割成文件,所有的全局变量都可以在所有文件中进行访问。

我想要做同样的事情,但使用OO风格。示例是我想要一个名为“BaseSub”的基类,它具有包含应用程序配置的散列,称为%Config。现在我有一个名为“DB”的子类用于数据库连接,我想从位于“BaseSub”包中的%Config访问设置。我怎么做。

+0

你有任何代码,你目前的工作? – Aldo

回答

3

如果你在这个时代写的perl OO,你真的应该使用Moose。它使OO代码更容易,更干净,更小。

继承变量的正确方法是创建对象属性。这里有一个简单的例子:

package MyBaseClass; 

use Moose; 

has config => (
    is => 'ro', 
    default => sub { { 
     who => 'World', 
    } } 
); 

package MyClass; 

use Moose; 

extends qw(MyBaseClass); 

sub greet 
{ 
    my $self = shift; 
    printf("Hello %s!\n", $self->config->{who}); 
} 

package main; 

my $object = MyClass->new(); 

$object->greet(); 

一个伟大的起点学习驼鹿是Moose::Manual

编辑:

如果你希望能够修改的配置,你可以只捅hashref从配置访问直接返回:

$object->config->{who} = 'Friends'; 

但更好的方法可能是做一个配置类,并使配置属性持有的一个实例:

package Myconfig; 

use Moose; 

has who => (is => 'rw', default => 'World'); 

package MyBaseClass; 

use Moose; 

has config => (
    is => 'ro', 
    isa => 'MyConfig', 
    default => sub { MyConfig->new }, 
); 

# inherit, instantiate, etc as before... 

$object->config->who('Friends'); 

另一种方法可能是Moose::Meta::Attribute::Native::Trait::Hash,它可以很容易地设置帮助器方法来处理本机Perl数据类型。

+0

好,我怎么能配置attr动态哈希也作为动态数组,我可以从基类甚至子类更改。 – daliaessam

+0

已更新我的答案,以包含有关制作可修改配置属性的建议。 – Lasse

+0

Moose默认安装在托管域中,因为它不是标准的Perl模块,或者我必须要求他们将其安装在服务器上吗? – daliaessam

3

使用其全名。

for (keys(%BaseSub::Config)) { 
    print("$_: $BaseSub::Config{$_}\n"); 
} 

你也可以导入它。

our %Config; *Config = \%BaseSub::Config; 

for (keys(%Config)) { 
    print("$_: $Config{$_}\n"); 
} 
+0

'for(keys%Config)'? – albe

+0

@albe,是的。固定。 – ikegami