【发布时间】:2012-06-12 15:46:37
【问题描述】:
我见过两种在派生类中实现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);
}
我不确定我是否理解其中的区别。谁能解释一下?
从您的 cmets 和答案中,我可以看到 ref() 部分很糟糕。
但是SUPER::new(@_) 的使用呢?在第一个示例中,hashref 被祝福到派生类中,然后该对象的 SUPER 的 new 被调用并保存到同一个对象中。
另一方面,在第二个示例中,基对象是从类的 SUPERs new 方法创建的,并被祝福到新类中。
这两种方式有什么区别?看起来第一个用基础对象覆盖了对象。第二个似乎是“双重祝福”。我很困惑。
【问题讨论】:
-
ref的这种短信用法显然永远不会消失。 ref($proto) in object constructors, ref($proto) - just say no! -
感谢 daxim 和 pilcrow 的解释。但是祝福呢?
标签: perl oop base-class