Perl 我怎么称呼祖父母';s构造函数(因为未定义父构造函数)?
我相信,在Perl中调用父类构造函数的规范方法是:Perl 我怎么称呼祖父母';s构造函数(因为未定义父构造函数)?,perl,oop,constructor,super,Perl,Oop,Constructor,Super,我相信,在Perl中调用父类构造函数的规范方法是: package Child; our @ISA = 'Parent'; sub new { my $class = shift; my @args = @_; my $self = $class->SUPER::new(@args); return $self; } 但是,如果Parent没有明确定义新的函数(但是祖父母定义了),那么这种构造似乎不起作用 例如,Net::FTP::File就是这种情况 tq84\u f
package Child;
our @ISA = 'Parent';
sub new {
my $class = shift;
my @args = @_;
my $self = $class->SUPER::new(@args);
return $self;
}
但是,如果Parent
没有明确定义新的
函数(但是祖父母
定义了),那么这种构造似乎不起作用
例如,Net::FTP::File
就是这种情况
tq84\u 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
函数
然而,如果Parent
没有明确定义一个新函数(但是祖父母
定义了),那么这种构造似乎不起作用
不是真的
$ perl -E'
package Grandparent {
sub new { CORE::say(__PACKAGE__) }
}
package Parent {
our @ISA = "Grandparent";
}
package Child {
our @ISA = "Parent";
sub new { my $class = shift; $class->SUPER::new(); }
}
Child->new();
'
Grandparent
找不到包Net::FTP::File
这是在尝试从尚未声明的类继承时获得的警告。具体地说,您正在尝试使用Net::FTP::File而不加载它
替换
our @ISA = 'Net::FTP::File';
与
或与
use parent 'Net::FTP::File';
无法通过包“tq84\u ftp”找到对象方法“new”
这条消息有点不清楚,但这是因为Net::FTP::File->new
不存在。Net::FTP::File不是一个类,更不是Net::FTP的子类。它没有方法,更不用说新的方法了。从Net::FTP::File继承是没有意义的
您似乎想要创建一个Net::FTP对象,所以请替换
use parent 'Net::FTP::File';
与
最后,您希望为添加到Net::FTP对象(包括从Net::FTP继承的类的对象)的方法加载Net::FTP::File。要做到这一点,只需添加
use Net::FTP::File qw( );
似乎您假定
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
的子类
你可以很容易地看到这一点,如果你看。请注意,下面没有使用基本'Net::FTP'
或使用父'Net::FTP'
或我们的@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编写的。但是你的类结构的设计有严重的错误,你不应该编写代码来回避它。你当然可以帮助我指出我应该问什么。你需要帮助你的类结构,如果你真的不知道如何进行,包括发布所有相关的代码。您很可能需要雇佣一名承包商。如果只有一两门课,那么如果你展示你所拥有的一切,我们可能会在这里帮助你,但我认为这是不可能的。为什么父母不能简单地从祖父母那里继承孩子所需要的一切?这就是我所拥有的。为什么父母不能简单地从祖父母那里继承孩子所需要的一切,我说不出来,因为我既没有写
Net::FTP::File
也没有写Net::FTP
。这是我的答案。以后,请发布您实际运行的代码,并提供该代码的实际输出。@ikegame感谢您为回答我的问题所做的努力。虽然我确信我复制/粘贴了正确的错误消息,但在一天太长的时间之后,我一定犯了一个草率的错误。无论如何,下次我会做得更好。
my $self = $class->SUPER::new('localhost') ...
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;
}