与孩子一起投下的Perl Moose父母班

xGh*_*ost 4 oop perl 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);
Run Code Online (Sandbox Code Playgroud)

是否可以将父类转换为子类,如c ++?在我的考试中,$ point3d现在是一个Point而不是Point3D包括Point.

pha*_*lon 5

看一下CPAN上的Class :: MOP文档,特别是clone_objectrebless_instance方法:

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

然后使用它如下:

my $point_3d = $point->to_3d(z => 7);
Run Code Online (Sandbox Code Playgroud)

这也将处理新指定的内容%args,就像它们已被构造函数传入一样.例如,构建器,默认值和类型约束都在此构建期间被考虑.