课程问题"控制"

时间:2017-10-09 17:06:32

标签: class object destructor

所以这就是事情..我有一个对象负责创建另一个不同的对象,这个创建的对象可以被破坏(取决于用户)。诀窍部分是"创作者"对象再次被调用,如果另一个对象没有被去除,这个类不能再次创建这个对象,但是如果另一个对象被去了,这个类需要再次创建并且循环继续。

我尝试了2个解决方案: 全局变量为" flag",它运行良好,但我被烘焙使用全局变量; 第二个是让析构函数返回一个值到这个标志,但我不能从析构函数返回。

除了全局变量之外,你们还知道另一种方法吗?

真的很吸引人的注意力,干杯。

1 个答案:

答案 0 :(得分:0)

您没有指定编程语言,所以我将假设Perl(使用Moo作为OO工具包)。

以下是您正在描述的内容的可能实现:

use v5.14.0;
use warnings;

package Item {
    use Moo;

    has _owner => (
        is       => 'ro',
        weak_ref => 1,
        clearer  => 1,
    );

    sub detach {
        my ($self) = @_;
        if (my $owner = $self->_owner) {
            $self->_clear_owner;
            $owner->_clear_item;
        }
    }

    sub BUILD {
        my ($self) = @_;
        say "!! constructing $self";
    }

    sub DEMOLISH {
        my ($self) = @_;
        say "!! destroying $self";
    }
}

package Owner {
    use Moo;

    has item => (
        is      => 'lazy',
        clearer => '_clear_item',
    );
    sub _build_item {
        my ($self) = @_;
        return Item->new(_owner => $self);
    }
}

my $owner = Owner->new;
say "owner = $owner";
say "(1) owner->item = ", $owner->item;
say "(2) owner->item = ", $owner->item;
say "entering block {";
{
    my $item = $owner->item;
    say "  (3) owner->item = $item";
    $item->detach;
    say "  detached item = $item";
}
say "} leaving block";
say "(4) owner->item = ", $owner->item;
say "owner is still = $owner";

当我运行此代码时,它会产生以下输出:

owner = Owner=HASH(0x23e52f8)
!! constructing Item=HASH(0x23e4950)
(1) owner->item = Item=HASH(0x23e4950)
(2) owner->item = Item=HASH(0x23e4950)
entering block {
  (3) owner->item = Item=HASH(0x23e4950)
  detached item = Item=HASH(0x23e4950)
!! destroying Item=HASH(0x23e4950)
} leaving block
!! constructing Item=HASH(0x23eb328)
(4) owner->item = Item=HASH(0x23eb328)
owner is still = Owner=HASH(0x23e52f8)
!! destroying Item=HASH(0x23eb328)

我们的想法是Owner类具有item属性(存储Item类的实例)。此属性是惰性的,因此它仅按需构建(第一次使用时)。

通过查看owner->item第1,2和3行可以看到,没有构建新对象:$owner会记住其item

但是,可以通过调用item明确销毁$owner->item->detach。这是可能的,因为Item的每个实例都有一个(可选)_owner属性;即每件物品都记得它的主人。这是一个弱参考,因为否则我们会有一个参考周期(所有者保持项目活着,项目保持所有者活着)。

当我们致电$item->detach时,$item会自动将其自身从其所有者身上移除(如果它还有一个)。一旦对它的任何其他引用消失,它就会自动销毁(在本例中,当局部变量$item在其块的末尾不再存在时会发生这种情况。)

$owner,已重置为初始状态,然后在下次需要时自动重新创建新item