2013-07-01 91 views
1

創建類對象使用Perl這是可能的:Perl中使用變量作爲類名稱

my @array = ($class1,$class2,$class3); 

foreach my $c (@array) 
{ 
    my $temp = $c->new(); 
    $temp->run($var1,$var2); 
} 

這背後的想法是,該陣列將始終包含不同的類名稱。然後我想創建該類的一個對象並從中運行一個方法。每個類都有點類似,但在run方法中包含自己的邏輯?

如果這是不可能的,有沒有不同的方式可以做到這一點? 這是不好的編程?

回答

5

你需要確保運行方法是始終可以訪問:

my @array = ($class1,$class2,$class3); 

foreach my $class (@array) { 
    my $temp = $class->new(); 
    if ($temp->can('run') { 
     $temp->run($var1,$var2); 
    } else { 
     ... 
    } 
} 
+0

謝謝,只是我正在尋找的答案 – BuildingJarl

-1
use strict; 
use warnings; 
use class1; 
use class2; 
use class3; 

my @array = qw(class1 class2 class3); 

foreach my $c (@array) 
{ 

    my ($var1, $var2) = (12,34); 
    my $temp = eval { $c->new }; 
    $temp->run($var1,$var2); 
} 

未經測試,但這是你應該調查的事情。你需要「使用」您正在使用的所有類,並一直使用嚴格給自己時間節省未來的問題

+0

爲什麼選擇?那麼嚴格就沒用了。 – 2013-07-01 11:01:12

+0

如果你想要的話,你可以做一個不嚴格的參考,但是你這樣做的時候正在編寫代碼。你需要在eval之後做一個if($ @)來檢查沒有任何東西被破壞。嚴格的會對代碼的其餘部分有好處,並且規則1在perl – KeepCalmAndCarryOn

+0

:/我更喜歡的是儘量少使用eval。而且它對我來說非常沒用:) – 2013-07-01 11:21:05

0

以前的答案覆蓋你在找什麼,但是我想補充一點,如果你不想在做這類事情時明確地使用()/ require()每個類的包,Module :: Runtime可能會有所幫助:

use Module::Runtime; 
for my $cls (@classes) { 
    my $obj = use_module($cls)->new; 
    ... 
} 
5

什麼讓perl中的類是bless sta tement。你用一個班級的名字祝福參考,而且是!那是班級。沒什麼特別的。

當然,你最終可能會遇到一個沒有方法的類,這可能有點問題。但是,我這樣做了,其中的子類都有一個共同的父類的子類,但類的類型改變類的行爲:

Package Main_class; 
use Carp; 

sub new { 
    my $class  = shift; #We'll ignore this one 
    my $subclass = shift; #This is my actual class 

    my $self = {}; 
    my $class .= "::$subclass"; 
    bless $self, $class; #Now, it's my class! 
    if (not $self->isa($class)) { 
     croak qw(Subclass "$subclass" is an invalid subclass); 
    } 
    return $self; 
} 

在我的計劃,我會做到這一點:

my $object = Main_class->new($subclass); 

而且,如果我不希望我的計劃,以死...

my $object; 
eval { 
    $object = Main_class->new($subclass); 
} 
if ([email protected]) { 
    Here be dragons.... #What do you do if that object creation failed... 
} 

這裏有一個程序,我這樣做的an example

在這裏我正在閱讀的問題和他們的類型的文件。我讀了宏名稱,以及它的問題類型。然後我用我的父類來創建對象,但我用正確的子類保佑它。重要的是使用可用於所有類的isa通用方法。我測試我創建的對象是否實際上是我的類的一個子類。

+0

感謝您的偉大答案,能夠得到一些關於perl的OOP的見解。無論如何,我認爲它對於我所做的事情有點矯枉過正,但我​​將來可能會做類似的事情 – BuildingJarl