继承父构造函数

时间:2014-02-19 15:25:07

标签: perl inheritance constructor

我是Perl继承的新手,并且无法找到继承父构造函数的明确指令。我假设父类的所有方法(包括构造函数)都是继承的,但看起来并非如此。所以,这还不够:

package Child;
use strict;
use Parent;
our @ISA=qw(Parent);

相反,我需要添加一个调用父构造函数的构造函数:

package Child;
use strict;
use Parent;
our @ISA=qw(Parent);

sub new {
  my $self=Parent::new(shift);
  bless $self;
  return $self;
}

也许有人可以为我澄清逻辑并告诉我是否继承父构造函数而不执行上面的操作(显式声明并调用父构造函数)?

3 个答案:

答案 0 :(得分:6)

你不需要这样做;你代码中的其他地方出了问题。

这是一个完整的工作示例:

main.pl:

use strict;
use warnings;
use Subclass;
my $object = Subclass->new();
print "object is a ", ref $object, "\n";

Subclass.pm:

package Subclass;
use strict;
use warnings;
use parent 'Superclass';
1;

Superclass.pm:

package Superclass;
use strict;
use warnings;
sub new {
    my $class = $_[0];
    return bless {}, $class;
}
1;

use parent 'Superclass'只需加载Superclass并为你设置@ISA。

答案 1 :(得分:0)

根据@ ysth的回答,您不需要覆盖父构造函数,除非您需要在构造函数中执行一些特殊操作。在这种情况下,您通常采用的方式如下:

sub new {
   my $class = shift;
   my $self  = $class->SUPER::new(@_);
   ...;
   return $self;
}

猜测,继承不正常的原因是您可能在超类中使用bless的一个参数形式。像这样:

bless $self;

除非在非常特殊的情况下,您应该总是更喜欢bless的双参数版本:

bless $self, $class;

$class是传递给new子的第一个参数。

答案 2 :(得分:-1)

通常,如果您希望一个类的构造函数调用父类,那么这将由“psuedo-class”SUPER处理。

package Derived;
use parent 'Base';

sub new { 
    my $class_name = shift;
    my $self       = $class_name->SUPER::new( @_ );

    return init_Derived( $self );
}

这只适用于单身下降。有了多个父母,你必须自己把它们捆绑在一起。