Perl 我怎么称呼祖父母';s构造函数(因为未定义父构造函数)?

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

我相信,在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 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;
}