我相信,在Perl中调用父类的构造函数的规范方法是:

package Child;
our @ISA = 'Parent';

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


但是,如果Parent没有显式定义new函数(但Grandparent确实定义了),则此构造似乎不起作用。

例如,使用Net::FTP::File就是这种情况。

tq84_ftp.pm

package tq84_ftp;

use warnings;
use strict;

our @ISA = qw(Net::FTP::File);

sub new {
  my $class = shift;
  my $self = $class->SUPER::new('localhost')
     or die($@);
  return $self;
}

1;


script.pl

use tq84_ftp;
tq84_ftp->new();


输出:

Can't locate package Net::FTP::File for @tq84_ftp::ISA at tq84_ftp.pm line 10.
Can't locate package Net::FTP::File for @tq84_ftp::ISA at tq84_ftp.pm line 10.
Can't locate object method "new" via package "tq84_ftp" at tq84_ftp.pm line 10.


如何指定希望Perl查找正确的(这里:Grantparent的)new函数?

最佳答案

看来您认为Net::FTP::FileNet::FTP的子类,因此

my $self = $class->SUPER::new('localhost') ...


应该调用Net::FTPnew方法。

但是,实际上,Net::FTP::File不能从Net::FTP继承。相反,它在Net::FTP中重新定义了一些方法。因此,如果您的类是从Net::FTP::File继承的,则它将不是Net::FTP的子级。

如果查看source code for Net::FTP,您可以轻松地看到这一点。请注意,下面没有use base 'Net::FTP'use parent 'Net::FTP'our @ISA = qw( Net::FTP )

package Net::FTP::File;

use strict;
use warnings;
use Net::FTP;

# ...

sub Net::FTP::pretty_dir {
    shift;
    my $newp = shift;
    if ( defined $newp ) {
        $pretty = $newp;
        $DirProcHash{cols} = $cols{pretty}  if $pretty;
        $DirProcHash{cols} = $cols{utility} if !$pretty;
    }
    return $pretty;
}

# ...

sub Net::FTP::isfile {
    my $ftp = shift;
    return 1 if $ftp->exists(@_) && !$ftp->isdir(@_);
    0;
}


等等等

关于perl - 我如何调用祖 parent 的构造函数(因为未定义 parent 的构造函数)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38687184/

10-16 07:50