Perl通过使用变量作为类名来创建类对象

Iva*_*her 1 perl

这可能使用Perl:

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

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

这背后的想法是数组将始终包含不同的类名.然后我想创建该类的对象并从中运行一个方法.每个类有点类似,但在run方法中包含自己的逻辑?

如果这是不可能的,我可以用不同的方式做到这一点吗?这是不好的编程吗?

小智 5

您需要确保始终可以访问run-Method:

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

foreach my $class (@array) {
    my $temp = $class->new();
    if ($temp->can('run') {
        $temp->run($var1,$var2);
    } else {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_* W. 5

是什么让perl中的类成为bless声明.你用一个类的名字祝福一个引用,并且wham!,就是那个类.没什么特别的.

当然,你可能最终得到一个没有方法的类,这可能有点问题.但是,我为子类共享公共父类的子类执行此操作,但类的类型更改了类的行为:

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;
}
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我会这样做:

 my $object = Main_class->new($subclass);
Run Code Online (Sandbox Code Playgroud)

而且,如果我不希望我的程序死...

my $object;
eval {
    $object = Main_class->new($subclass);
}
if ( $@ ) {
    Here be dragons....    #What do you do if that object creation failed...
}
Run Code Online (Sandbox Code Playgroud)

这是我执行此操作的程序示例.

在这里,我正在阅读一个问题及其类型的文件.我读了宏名称,以及问题的类型.然后我使用我的父类来创建对象,但我用正确的子类祝福它.重要的是使用isa所有类可用的通用方法.我测试我创建的对象是否实际上是我的类的子类.