我相信,在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::File
是Net::FTP
的子类,因此
my $self = $class->SUPER::new('localhost') ...
应该调用
Net::FTP
的new
方法。但是,实际上,
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/