オブジェクト偏その6-多重継承

多重継承は早いもの勝ち

少し復習です。

  • Perlのオブジェクトは元々は変数のリファレンスです。
  • blessするとオブジェクトとして振る舞います。
  • その性質はblessで関連づけられたクラスの性質を引き継ぎます。
  • そのクラスは他のクラスの性質を引き継ぐことができます。
  • どのクラスの性質を引き継いでいるかは@ISAという配列で管理しています。
  • blessで関連付けられたクラスにメソッドがない場合は@ISAにあるクラスにそのメソッドがないか調べます。

今回は@ISAに複数のクラスが指定されていて、そのクラスが同じ名前のメソッド(振る舞いは違う)を持っていた場合を解説したいと思います。

次のスクリプトを記述して、実行してみてください。
C:\work\exaple\oop_006.pl

#!C:\Perl\bin\perl
use strict;
use warnings;
my $bat = Bat->new;

$bat->speak;

package Beast;
use strict;
use warnings;
use vars qw(@ISA);

sub new { bless {}, $_[0] }
sub speak { 
	print "I am a Beast\n";
}

package Bird;
use strict;
use warnings;
use vars qw(@ISA);

sub new { bless {}, $_[0] }
sub speak { 
	print "I am a Bird\n";
}

package Bat;
use strict;
use warnings;
use vars qw(@ISA);
use base qw/Beast Bird/;
	
sub speak { 
	my $self = shift;
	$self->SUPER::speak; 
	print "my parent are ", join ', ', @ISA;
}


どうやらこのこうもりは自分は獣だということらしいです。
先ほどのスクリプトのBatクラスを少し変更して下さい。
C:\work\exaple\oop_006.pl

package Bat;
use strict;
use warnings;
use vars qw(@ISA);
use base qw/Bird Beast/;
	
sub speak { 
	my $self = shift;
	$self->SUPER::speak; 
	print "my parent are ", join ', ', @ISA;
}


どうやら今度は鳥らしいです。

しばらくは、親クラスの指定する順番によって振る舞いが変わるという
ことをなんとなく覚えておくだけでと良いかと思います。

お疲れさまでした。
次回はオブジェクトの作成と初期化を切り離すイニシャライズを解説します。