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++ を触らなくなってしまったので、継承とか完全に忘れてるっぽいなぁ…(´д`;)