perl – 如何让Moose返回子类实例而不是它自己的类,用于多态
我想创建一个泛型类,其构建器不会返回此泛型类的实例,而是返回专用子类的实例.
当Moose进行自动对象构建时,我无法理解这是否可能,以及如何使用Moose语法创建一个Moose类并具有此行为. 例如.: 用户将使用$file,就好像它是一个Repository实例,而不需要知道真正的子类(多态) 注意: 解决方法
new构建构建器.您想要一些其他方法来实际返回构建的对象.
这是一个例子: class RepositoryBuilder { has 'allow_network_repositories' => ( is => 'ro',isa => 'Bool',required => 1,); method build_repository(Uri $url) { confess 'network access is not allowed' if $url->is_network_url && !$self->allow_network_repositories; my $class = $self->determine_class_for($url); # Repository::Whatever return $class->new( url => $url ); } } role Repository { <whatever } class Repository::File with Repository {} class Repository::HTTP with Repository {} 这里,构建器和构建的对象是不同的.建设者是一个 此外,您构建的存储库不需要继承 以下是我们如何使用我们创建的构建器.如果,比方说,你不想 my $b = RepositoryBuilder->new( allow_network_repositories => 0 ); $b->build_repository( 'http://google.com/' ); # error $b->build_repository( 'file:///home/whatever' ); # returns a Repository::Foo 但如果你这样做: my $b = RepositoryBuilder->new( allow_network_repositories => 1 ); $b->build_repository( 'http://google.com/' ); # Repository::HTTP 现在您有了一个构建器,可以按照您喜欢的方式构建对象, class SomethingThatHasARepository { has 'repository' => ( is => 'ro',does => 'Repository',); } 而且你已经完成了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |