Perl Moose 父类与子类一起转换

标签 perl oop moose

package Point;
use Moose;

has 'x' => (isa => 'Int', is => 'rw');
has 'y' => (isa => 'Int', is => 'rw');

package Point3D;
use Moose;

extends 'Point';

has 'z' => (isa => 'Int', is => 'rw');

package main;

use Data::Dumper;

my $point1 = Point->new(x => 5, y => 7);
my $point3d = Point3D->new(z => -5);

$point3d = $point1;
print Dumper($point3d);

是否可以将父类转换为 C++ 等子类?在我的例子中, $point3d 现在是一个 Point 而不是 Point3D 包括 Point。

最佳答案

看看Class::MOP documentation on CPAN ,尤其是 clone_objectrebless_instance方法:

sub to_3d {
  my ($self, %args) = @_;
  return Point3D->meta->rebless_instance(
    $self->meta->clone_object($self),
    %args,
  );
}

然后像下面这样使用它:
my $point_3d = $point->to_3d(z => 7);

这也会照顾到处理新指定的 %args就好像它们是由构造函数传入的一样。例如。在这个构建过程中,构建器、默认值和类型约束都被考虑在内。

关于Perl Moose 父类与子类一起转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4583719/

相关文章:

Perl十进制到二进制转换

perl - 传递函数对象并调用它

c++ - 无法在构造函数中访问类的继承成员

perl - 如何更新散列属性,更新 Perl Moose 中的其他散列属性

perl - 使用 MooseX::Declare 关闭内联构造函数

linux - 如何在 linux 中使用 perl 脚本执行 avconv 命令

c++ - 循环数据依赖析构函数

design-patterns - 设计/实现与同一对象具有 "has a"关系的两个(或更多)类的正确方法是什么?

perl - 驼鹿强制转换为文件权限八进制值

perl - 如何将 Perl 代码标记为已弃用?