1

SUPERタイトルの通り、多重継承を利用し、2 つの関数の両方を呼び出す必要がある厄介なコードに取り組んでいます。2 つの親クラスのどちらから関数を実行したいかを Perl に示す方法はありますか? を使用すると、ドキュメントに従って$self->SUPER::foo($bar);、最初に一致する関数のみが実行されます。@ISA

以下は、クラスがどのように継承されるかを示しています。

          [Base Class]
               |
 ----------------------------
 |                          |
[A]                        [B]
 |                          |
 ----------------------------
               |
              [C]
4

2 に答える 2

8

指定するだけです。

$self->A::foo($bar)

また

$self->B::foo($bar)

mroもご覧ください。

于 2013-03-14T16:32:34.413 に答える
1

いくつかのオプションがあります。

スーパークラスの候補が常に 2 つしかない場合は、強制的@ISAに両方向で検索することができます。

$self->SUPER::method;
{
    local @ISA = reverse @ISA;
    $self->SUPER::method;
}

または、もっと賢いことをしたい場合は、実行時にすべてのスーパークラスのメソッドの名前を作成できます。

my ($caller) = (caller(0))[3] =~ /([^:]+)\z/;
for my $super (@ISA) {
    my $method = join '::', $super, $caller;
    $self->$method if exists &$method;
}

最初の行は、現在実行中のメソッドの名前を取得し、パッケージ名の情報を取り除き、生の名前だけを残します。次に、各パッケージ名に追加され@ISA、メソッドが存在する場合は呼び出されます。

于 2013-03-14T16:57:55.047 に答える