为什么我无法在以下代码中使用子对象调用parent的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;
}
答案 0 :(得分:5)
这是因为在@ISA
中的赋值是在运行时完成的,因此在您尝试调用该方法之后。
你可以通过BEGIN
周围的工作,将它移动到编译时间:
BEGIN { our @ISA = qw( C::Main ) }
或者你可以做
use base qw( C::Main );
也是在编译时完成的。这两种变体都可以解决您的问题。
答案 1 :(得分:0)
如果你在Perl中编写新的OO代码,请使用Moose!
使用Moose后回到'使用基地'就像回到20世纪50年代。