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

时间:2011-03-02 21:17:57

标签: perl perl-module

为什么我无法在以下代码中使用子对象调用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;
    }

2 个答案:

答案 0 :(得分:5)

这是因为在@ISA中的赋值是在运行时完成的,因此在您尝试调用该方法之后。

你可以通过BEGIN周围的工作,将它移动到编译时间:

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

或者你可以做

use base qw( C::Main );

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

答案 1 :(得分:0)

如果你在Perl中编写新的OO代码,请使用Moose!

使用Moose后回到'使用基地'就像回到20世纪50年代。