2017-02-04 81 views
-1

我對Moose和OO編程相當陌生。尋找一些指導。我有以下Dir穆斯類,建立File對象的列表:擴展Moose類以使內部可以使用不同的類

#!usr/bin/perl 
package Dir; 
use Moose; 
use Modern::Perl; 

has 'files' =>   (is => 'rw', isa => 'HashRef[File]'); 

<..> 

sub BUILD { 
    my $self = shift; 

<..> 

map { $files{$_} = File->new (path => $path . '/' . $_) } @file_names; 
$self->files (\%files); 

<..> 
} 

我想編寫一個名爲MyDirextends上述Dir類新類。然而,而不是創建File類對象,我想用專門的對象擴展File對象:

#!usr/bin/perl 
package MyDir; 
use Moose; 
use Modern::Perl; 

has 'type' => (is => 'ro', isa => 'Str', default => ''); 
has 'files' => (is => 'rw', isa => 'HashRef[MyFile]'); 

我想穆斯可能有辦法做到這一點無需重寫BUILD子程序,但我不確定如何執行此操作。

+3

不要在無效的情況下使用'map' 。這只是一個「for」循環。 – melpomene

+0

'$ path'和'@ file_names'從哪裏來? – melpomene

+0

'$ path'是傳遞給構造函數的參數。 '@ file_names'只是目錄內的文件名數組。我刪除了與該問題無關的所有代碼。 – StevieD

回答

0

我找到了一個很好的解決方案通過添加新的屬性:

has 'file_class' => (is => 'ro', isa => 'ClassName', default => 'File'); 

現在我的代碼,設置files屬性是這樣的:

map { $files{$_} = $self->file_class->new (path => $path . '/' . $_) } @file_names; 
+0

我猜這是downvoted,因爲您仍然使用'map'奇怪的方式。類的方法很好,它很容易擴展,但你應該真的擺脫了'map',只需要執行'$ files {$ _} = $ self-> file_class-> new(...) for @file_names;'。它更具可讀性,並且沒有使用函數它在void上下文中返回一個值。 – simbabque

+0

我被粉碎了。不知道我現在怎樣才能繼續生活。 – StevieD

相關問題