2013-07-01 62 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