2

我是 Perl 的新手,并且已将 Moose 作为 Perl OO 的源代码,但我在使其工作时遇到了一些问题。具体来说,超类的方法似乎没有被继承。为了测试这一点,我创建了三个文件,其中包含以下内容:

东西测试.pl

use strict;
use warnings;
require "thing_inherited.pm";
thing_inherited->hello();

东西.pm

package thing;

use strict;
use warnings;
use Moose;

sub hello
{
    print "poo";
}

sub bye
{
    print "naaaa";
}

1;

最后,thing_inherited.pm

package thing_inherited;

use strict;
use warnings;
use Moose;

extends "thing";

sub hello
{
    bye();
}

1;

所以人们通常期望的是方法 bye 作为子类的一部分被继承,但我却得到了这个错误......

Undefined subroutine &thing_inherited::bye called at thing_inherited.pm line 11.

谁能解释我在这里做错了什么?谢谢!

编辑:在这样做时,我遇到了另一个难题:从我的超类调用我的基类中应该被超类覆盖的方法没有被覆盖。说我有

sub whatever
{

    print "ignored";

}

在我的基类中并添加

whatever();

在我的 bye 方法中,调用 bye 不会产生覆盖的结果,只会打印“忽略”。

4

2 回答 2

8

你有一个函数调用,而不是一个方法调用。继承只适用于类和对象,即方法调用。方法调用看起来像$object->methodor $class->method

sub hello
{
    my ($self) = @_;
    $self->bye();
}

顺便说一句,require "thing_inherited.pm";应该是use thing_inherited;

于 2013-10-15T19:19:12.807 回答
0

只是一些修复。thing.pm 很好,但请查看 thingtest.pl 和 thing_inherited.pm 的更改。

thingtest.pl:使用前需要实例化对象,然后可以使用方法

use thing_inherited;
use strict;
use warnings;

my $thing = thing_inherited->new();
$thing->hello();

thing_inherited.pm:因为 hello 方法正在调用它的类中的方法,所以你需要告诉它

package thing_inherited;
use strict;
use warnings;
use Moose;

extends "thing";

sub hello {
  my $self = shift;
  $self->bye();
  }

1;

输出:

$ perl thingtest.pl

呸呸呸$

于 2014-01-02T13:46:09.380 回答