所以这就是事情..我有一个对象负责创建另一个不同的对象,这个创建的对象可以被破坏(取决于用户)。诀窍部分是"创作者"对象再次被调用,如果另一个对象没有被去除,这个类不能再次创建这个对象,但是如果另一个对象被去了,这个类需要再次创建并且循环继续。
我尝试了2个解决方案: 全局变量为" flag",它运行良好,但我被烘焙使用全局变量; 第二个是让析构函数返回一个值到这个标志,但我不能从析构函数返回。
除了全局变量之外,你们还知道另一种方法吗?
真的很吸引人的注意力,干杯。
答案 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
。