Perl OO Вопрос, Наследование - вызов родительского метода - PullRequest
2 голосов
/ 03 марта 2011

Почему я не могу вызвать метод test родительского объекта с использованием дочернего объекта в следующем коде?

    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 ]

5 голосов
/ 03 марта 2011

Это потому, что присвоение @ISA выполняется во время выполнения, поэтому после попытки вызова метода.

Вы можете заставить его работать, окружив BEGIN, переместив его во время компиляции:

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

или вы можете сделать

use base qw( C::Main );

, что также делается во время компиляции.Оба варианта решают вашу проблему.

0 голосов
/ 03 марта 2011

Если вы пишете новый OO-код на Perl, используйте Moose!

Возвращение к «использованию базы» после использования Moose похоже на возвращение в 1950-е годы.

...