2

私は Perl を初めて使用し、Perl OO のソースとして Moose を使用するよう指示されましたが、動作させるのにいくつか問題があります。具体的には、スーパークラスのメソッドは継承されていないようです。これをテストするために、以下を含む 3 つのファイルを作成しました。

thingtest.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->methodまたはのようになり$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;

出力:

$ perlthingtest.pl

いやあ$

于 2014-01-02T13:46:09.380 に答える