Perlでのオブジェクト指向について
Perlは元々は、オブジェクト指向言語ではありません。
しかし、柔軟な言語仕様のPerlでは、オブジェクト指向言語のように振る舞うことも可能なのです。
普通、オブジェクト指向プログラミングでは、以下の要素が必要です。
- クラス(Perlではパッケージで対応)
- インターフェース(Perlでは不完全だけどパッケージで対応)
- コンストラクタ(Perlではblessリファレンスで対応)
- オーバーライド(Perlでは普通に対応)
- オーバーロード(Perlでは複数の同名subは無理。しかし、一つのsubでオーバーロードもどきは可能)
- カプセル化(Perlでは言語仕様的に無理)
- 継承(Perlでは普通に対応)
- 委譲(Perlでは普通に対応)
- 多態性(Perlでは普通に対応)
ということで、カプセル化とオーバーロード以外は、大丈夫なのです。
以下に、クラス、コンストラクタ、継承、多態性、オーバーライドを使用したサンプルを書いてみました。
- クラスは、Person、Otokonoko、Onnanokoのパッケージを使用する。
- コンストラクタは、『return bless $self, $class;』でblessリファレンスをコンストラクトする。
- 継承は、『use base 'Person';』でbaseプラグマを使用する。
- 多態性は、動的な条件によって、予めコーディングしてあるオブジェクトのメソッドの振る舞いが替わる。
- オーバーライドは、スーパークラスでの抽象getNameメソッドをサブクラスの具象getNameメソッドで置き換える。
◆サンプル
use strict; use warnings; my $obj; my $hiki = shift; if ($hiki eq '1') { $obj = Otokonoko->new(); } else { $obj = Onnanoko->new(); } print $obj->getName(), "\n"; $obj->shumi(); package Person; sub new { my $class = shift; my $self = { Name => $class, }; return bless $self, $class; } sub getName {}; package Otokonoko; use base 'Person'; sub getName { my $self = shift; return $self->{Name}; } sub shumi { print "バスケ\n"; } package Onnanoko; use base 'Person'; sub getName { my $self = shift; return $self->{Name}; } sub shumi { print "ケーキ作り\n"; }
◆実行結果
C:\perltest>perl tatai.pl 1 Otokonoko バスケ C:\perltest>perl tatai.pl 2 Onnanoko ケーキ作り
もしかしたら、かなり間違ったこと書いているかもしれません。その時は、ご指摘、コメント下さい!