-1

以下は最小化された例で、OA.pm(親オブジェクト)、OB.pm子オブジェクト、およびランナースクリプトがあります。

オブジェクトOB:

package OB;

use OA;
require Exporter;
@ISA = (Exporter, OA);
@EXPORT = ();

sub new {
    my $class = shift;

    print $class->SUPER;
    bless {}, $class;
};

1;

オブジェクトOA:

package OA;

require Exporter;
@ISA = (Exporter);
@EXPORT = ();

sub new {
    bless {}, shift;
};

1;

そしてランナー:

#!/usr/bin/perl

use strict;
use warnings;
use OB;

print OB->new;

私がそれを実行すると、私は得ました:

Can't locate object method "SUPER" via package "OB" at OB.pm line 10.

1)何が間違っている可能性がありますか?

2)そして、私が複数の親を持っている場合、SUPERは何を指しますか?

3)use OA必須でしたか?

4

1 に答える 1

3

Rubyとは異なり、参照しているメソッド全体を明示的に記述する必要があります。

print $class->SUPER::new;

これは、メソッドを呼び出したいと想定しています。どの親クラスに新しいメソッドが含まれているかを把握することが目的の場合、それは複雑であり、ここではその方法の説明をスキップします。

クラスに複数の親、多重継承がある場合、Perlは通常、最初に親の深さを調べて一致するメソッドを探します。これは多くの場合問題があり、ダイヤモンド継承の問題を回避するC3メソッドの解決順序(mro)に切り替えることができます。use mro "c3"

SUPERと多重継承の詳細については

最後に、use OAまたはrequire OAOAクラスをロードするために必須でした。を使用して、クラスを1行でロードおよび継承できますuse parent "OA"

于 2012-11-10T08:44:15.460 に答える