在Moose中,如何让类的构造函数返回子类的实例?

Rya*_*son 4 perl constructor subclass moose

可能重复:
如何让Moose返回子类实例而不是它自己的类,以获得多态性

假设我有两个相关的类MyClass :: A和MyClass :: B,它们都是MyClass的子类.我希望MyClass的构造函数获取文件名,读取文件,并根据文件的内容,确定文件是A还是B类型.然后,它应该构造一个相应子类的对象并返回它.编辑:实际上,它应该调用相应子类的构造函数并返回结果.

例如,在此代码之后,

my $filename = "file_of_type_A.txt";
my $object = MyClass->new($filename);
Run Code Online (Sandbox Code Playgroud)

$object应该是MyClass :: A的一个实例.这似乎是有效的行为,因为它$object->isa('MyClass')总是会返回true.我正在考虑使用内省来获取MyClass的所有子类的列表,然后尝试依次构造每个子类,直到成功.但是,我没有看到修改Moose构造函数来实现此目的的方法.BUILDARGS和BUILD钩子似乎都不合适.

那么如何修改Moose类的构造函数来选择合适的子类并将构造委托给该子类?

dao*_*oad 5

正如上面提到的Ether,你应该有一个工厂方法来完成这个任务.我喜欢将工厂方法放在一个单独的包/类中,而不是它生成的东西通常这是一个没有属性或构造函数的虚拟类,但如果你想做一些事情,比如跟踪你做了什么,你可以创建一个实际的工厂对象.

package MyFile::Factory;

sub make_file_object {
    my $class = shift;
    my $filepath = shift;

    my $type = $class->determine_file_type( $filepath );
    my $file_class = $class->get_class_for_file_type( $type );

   return $file_class->new( $filepath, @_ );
}

# implement those other methods down here.

1;
Run Code Online (Sandbox Code Playgroud)