gpt4 book ai didi

perl - 我如何调用祖 parent 的构造函数(因为未定义 parent 的构造函数)?

转载 作者:行者123 更新时间:2023-12-01 00:39:52 25 4
gpt4 key购买 nike

我相信,在 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 的) 函数?

最佳答案

However, this construct doesn't seem to work if Parent does not explicitely define a new function (but Grandparent does).

不正确。

$ 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

Can't locate package Net::FTP::File

这是当您尝试从尚未声明的类继承时获得的警告。具体来说,您试图在未加载 Net::FTP::File 的情况下使用它。

替换

our @ISA = 'Net::FTP::File';

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

或与

use parent 'Net::FTP::File';

Can't locate object method "new" via package "tq84_ftp"

这条消息有点不清楚,但这是因为 Net::FTP::File->new 不存在。 Net::FTP::File 不是类,更不是 Net::FTP 的子类。它没有方法,更不用说 new 方法了。从 Net::FTP::File 继承是没有意义的。

你似乎想创建一个 Net::FTP 对象,所以替换

use parent 'Net::FTP::File';

use parent 'Net::FTP';

最后,您要为它添加到 Net::FTP 对象(包括从 Net::FTP 继承的类的对象)的方法加载 Net::FTP::File。为此,只需添加

use Net::FTP::File qw( );

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com