読者です 読者をやめる 読者になる 読者になる

Perl で親クラスのメソッドを呼び出す方法

perl

混乱しそうになったのでメモしておく。
結論的には、親クラスのメソッド呼び出しは 「細い矢印+SUPER」 を使おうねというだけの話。詳しくは、以下のソース中の コメントを参照。

{ package LivingCreature;
  sub speak {
    my $class = shift;
    print "a $class goes ", $class->sound, "!\n";
  }
}

{ package Animal;
  use base qw{LivingCreature};
}

{ package Mouse;
  use base qw{Animal};
  sub sound { 'squeak' }
  sub speak {
    my $class = shift;

    # 継承の概念が使われるので、LivingCreature の speak が呼び出される
    # SUPER::speak は、カレントパッケージの @ISA の中で speak を探し、
    # 複数のものがある場合には最初に見つかったものを呼び出すという意味。p.147
    # 細い矢印を使っているので、引数としてはクラス名の Mouse が渡される。
    $class->SUPER::speak;

    # 細い矢印を使わないと、継承という概念の無いただのサブルーチンとして扱われてしまうのでコンパイル時エラーになる。 p.146
#    Animal::speak;

    print "[but you can barely hear it!]\n";
  }
}
Mouse->speak;

参考

続・初めてのPerl p.146〜p.147