gpt4 book ai didi

perl - 调用SUPER::new()

转载 作者:行者123 更新时间:2023-12-04 22:23:16 25 4
gpt4 key购买 nike

我已经看到了两种在派生类中实现new方法的方法。

方法一:

sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {};
bless($self, $class);
$self = $self->SUPER::new( @_ );
return($self);
}

方法二:
sub new {
my $self = shift;
my $class = ref($self) || $self;
return $self if ref $self;
my $base_object = $class->SUPER::new(@_);
return bless ($base_object, $class);
}

我不确定我是否知道有什么区别。谁能解释一下?

从您的评论和答案中,我可以看到 ref()部分不好。

但是 SUPER::new(@_)的用法呢?在第一个示例中,hashref被祝福到派生类中,然后调用该对象的 SUPERnew并将其保存到同一对象中。

另一方面,在第二个示例中,从该类的 SUPERnew方法创建一个基础对象,并将其添加到新类中。

这两种方式有什么区别?看起来像第一个对象用基础对象覆盖了该对象。第二个似乎是“双重祝福”。我很困惑。

最佳答案

更新

你问:

What is the difference between these two ways? It looks like the first overwrites the object with the base object. The second seems to "double-bless". I'm confused.



振作起来您显示的这两种方法中的每一种本身都是困惑的,都不应该被模仿。

方法一祝福一个DerivedClass类的对象存在,然后使用该对象调用某些AncestorClass的分配器/构造函数,以替换自身。现在,AncestorClass::new可能还使用了不幸的 ref($yuck) || $yuck惯用语,这意味着新对象将被祝福到DerivedClass中。因此,一个DerivedClass对象用于构造另一个对象来替换它。可疑。

如果接收方是对象,则方法二返回其接收方($ self)。 (请注意,仅需检查一次 ref($self)时,便会检查两次。)也就是说, $o->new()在方法2下返回的 $o完全相同。如果接收方不是对象而是类名,也就是说,相反,我们调用了 DerivedClass->new,那么将调用AncestorClass::new。但是父类(super class)方法的第一个参数是DerivedClass,并且可能父类(super class)没有对其 bless ed包名称进行硬编码,因此后续的重新祝福是没有意义的。

只是不用担心这些例子。相反,请咨询 perlobjperlootut以获取安全和合理使用SUPER的信息。

原始答案

啊,我的眼睛!

正如daxim所评论的,方法1是一种令人反感的方法,该方法允许人们从与现有对象相同的类中构造一个对象:
my $o1 = MethodOne->new();
my $o2 = $o1->new(); # $o2 is a clone of $o1. No, wait, it isn't!
# It's a brand new, "empty" object. Ha,
# fooled you.

方法二(我认为)是解决此困惑做法的一种解决方法。如果调用了 new(),则方法二将返回 完全相同的对象
my $o1 = MethodTwo->new();
my $o2 = $o1->new(); # $o2 is a new MethodTwo. No, wait, it isn't!
# It's a brand new object. No, wait, it isn't!
# It's a /exactly the same object/ as $o1. Ha,
# fooled you.

都不使用。 :)可能在某些应用中,以上两种语义中的任何一种都非常有意义。我只是不会在那些应用程序中将该方法命名为 new() ...

关于perl - 调用SUPER::new(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com