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.
看一下CPAN上的Class :: MOP文档,特别是clone_object和rebless_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,就像它们已被构造函数传入一样.例如,构建器,默认值和类型约束都在此构建期间被考虑.