Perl でクラスを作って、継承した時の関数のオーバーライドとか。
package Foo; ######## sub new { my $class = shift; print 'Foo::new - ', $class, " "; bless {}, $class; } sub func { my $self = shift; print 'Foo::func - ', ref $self, " "; } package Bar; ######## use base 'Foo'; package Baz; ######## use base 'Bar'; sub func { my $self = shift; $self->SUPER::func; print 'Baz::func - ', ref $self, " "; } package main; ######## print __LINE__, " "; Foo->new->func(); print __LINE__, " "; Bar->new->func(); print __LINE__, " "; Baz->new->func();
27 # Foo インスタンスが生成されて Foo::new - Foo # Foo::func が呼ばれる Foo::func - Foo 28 # 自分は Bar だけれど、親の Foo:new で Bar インスタンスが生成されて Foo::new - Bar # Bar では func を定義(オーバーライド)していないので、Foo::func が呼ばれる Foo::func - Bar 29 Foo::new - Baz # Baz の親クラス(Bar)の func を呼び出したら、Bar ではオーバーライドしていなかったので、 # 親をすっとばしてお爺ちゃん(Foo:::func)が呼ばれる Foo::func - Baz Baz::func - Baz
参考にした モダンPerlの世界へようこそ:第2回 mro:次のメソッドはどこ? では、多重継承にまで話題が広がっていますが、まずは基本的なところから。C++ を使っていた頃でも、継承しまくりなクラスに出くわしたことがないので、案外平和な OOP ライフを送ってこれたのかも。しかし、最近全く C++ を触らなくなってしまったので、継承とか完全に忘れてるっぽいなぁ…(´д`;)