使用 `bless` 创建具有继承性的对象

Create an object with inheritance using `bless`

如何使用 bless 继承创建匿名 class 的对象?

我想我需要设置 @ISA,但是如何使用 strict 来完成?


在 райтфолд 的提示后,我看了一下 Class::Inner。他们通过

解决继承问题
no strict 'refs';
@{"$anon_class\::ISA"} = $parent;

有没有办法仍然使用严格的引用来完成它?

使用 parent 为您的 class 设置基数 class。 bless与继承无关:

package Derived;
use warnings;
use strict;
use parent qw(Base);

sub new {
    my $class = shift;
    return bless {}, $class;
}

如果你在玩这些东西,你有时会违反 strict。 Pragma strict 是为了保护你不犯错误。如果您确定自己在做什么,则绝对可以在某些有限范围内关闭 strict 并且最好限制在您的 OP 中的特定内容。所以当你知道自己在做什么时,这段代码就很好

{
    no strict 'refs';
    @{"$anon_class\::ISA"} = ($parent);
}

Is there a way to accomplish that still using strict refs?

为什么?这正是 strict 旨在捕捉的东西。当然,你可以愚弄严格,但最好清楚你正在做一些通常严格禁止的事情。

在我看来,

{ no strict 'refs'; @{ $anon_class . '::ISA' } = $parent; }

比使用 eval%:: 好得多(即使它们并不长)。