Perl OO问题,继承-调用父方法

mzsu5hc0  于 2023-08-06  发布在  Perl
关注(0)|答案(2)|浏览(143)

为什么我不能在下面的代码中使用子对象调用父对象的testmethod?

use strict;
use Data::Dumper;

my $a = C::Main->new('Email');
$a->testmethod();

package C::Main;

sub new {
    my $class = shift;
    my $type  = shift;
    $class .= "::" . $type;
    my $fmgr = bless {}, $class;
    $fmgr->init(@_);
    return $fmgr;
}

sub init {
    my $fmgr = shift;
    $fmgr;
}

sub testmethod {
    print "SSS";
}

package C::Main::Email;
use Net::FTP;

@C::Main::Email::ISA = qw( C::Main );

sub init {
    my $fmgr = shift;
    my $ftp = $fmgr->{ftp} = Net::FTP->new( $_[0] );
    $fmgr;
}

package C::Main::FTP;
use strict;
use Net::FTP;

@C::Main::Email::FTP = qw( C::Main );

sub init {
    my $fmgr = shift;
    $fmgr;
}

字符串

disbfnqx

disbfnqx1#

这是因为对@ISA的赋值是在运行时完成的,因此在您尝试调用该方法之后。
你可以通过用BEGIN包围它,将它移动到编译时来使它工作:

BEGIN { our @ISA = qw( C::Main ) }

字符串
或者你可以

use base qw( C::Main );


这也是在编译时完成的。这两种变体都可以解决您的问题。

omqzjyyz

omqzjyyz2#

如果您正在用Perl编写新的OO代码,请使用Moose!
在使用过驼鹿之后回到“使用基地”就像回到了20世纪50年代。

相关问题