Perl オブジェクト指向の例
まず、Perlにおけるオブジェクト指向プログラミングの3つの基本的な定義について見ていきましょう。
オブジェクトは単純な参照で、どのクラスに属しているのかを知ることができます。(オブジェクトは参照変数です)。
2. クラスは単純なパッケージで、それに属するオブジェクトにいくつかのメソッドを提供する方法をもっています。(クラスはパッケージです)
メソッドとは、オブジェクトまたはクラス名を第1引数にとる単純なサブルーチンです(クラスのメソッドは、クラス名またはオブジェクトを第1引数にとるメソッドです)。
クラスは単にパッケージです
C++とは異なり、Perlではクラス定義のための特別な構文は用意されていません。実際、クラスは単なるパッケージです。パッケージをクラスとして使用し、パッケージ内の関数をクラスのメソッドとして使用することができます。ただし、@ISAという特殊な配列があり、これは"Perlが目的のメソッドを現在のパッケージで見つけられない場合、どこかで探し続けなければならない"と言っています。これは、Perlが継承を実装するための鍵です。ISAの各要素は、異なるパッケージの名前です。クラスはメソッドが見つからない場合、@ISA配列から順次(深さ方向から)メソッドを探します。クラスは@ISAにアクセスすることで、どのクラスが自分のベースクラスであるかを知ることができます。
すべてのクラスは暗黙のベースクラス(祖先クラス): "UNIVERSAL" を持ちます。UNIVERSAL"クラスは、そのサブクラスに対していくつかの汎用クラスメソッドを提供します。isa, can は変数がクラスから継承されているかどうかを判断するためのメソッドで、can はそのメソッドがクラスまたはベースクラスで定義されているかどうかを判断するためのメソッドに続いて提供されます。さらに、UNIVERSALに新しいメソッドを追加することができます。一度新しいメソッドを追加すると、すべてのクラスがそれを呼び出すことができます。
UNIBERSALに新しいメソッドを追加する例。
sub UNIVERSAL::log()
{
my($self,$msg)=@_;
print "$self: $msg\n";
}
これにより、各クラスで関数を呼び出すことができ、ロギング前にクラス名が出力されます。
オブジェクトは単なる参照
Perl のコンストラクタは bless で処理される参照を返すサブルーチンに過ぎず、これを人は "object" と呼び、 bless の目的はオブジェクトがどの "class" に属しているかを示すことです。
最もシンプルなコンストラクタです。
package Critter;
sub new { bless {} }
もし、ユーザーがコンストラクタを "CLASS->new()" だけでなく、 "$obj->new()" という形で呼び出せるようにしたい場合は、次のようにしてください。
sub new {
my $this = shift;
my $class = ref($this) || $this;
my $self = {};
bless $self, $class;
$self->initialize();
return $self;
}
メソッドは単純なサブルーチンです
メソッドは、呼び出されるオブジェクトまたはクラスの名前を最初の引数として受け取ります。メソッドの呼び出し方には2種類あり、「クラスメソッドの呼び出し」と「インスタンスメソッドの呼び出し」になります。クラスメソッドは、クラス名を第一引数にとります。このメソッドは、特定のオブジェクトではなく、クラスに固有の機能を提供します。コンストラクタは通常クラスメソッドです。ほとんどのクラスメソッドは、最初の引数を無視します。
Perlでは、メソッドを呼び出すために2つの異なる形式が用意されています。最も単純な形式は、矢印の記法を使用します。
my $fred = Critter->find("Fred");
$fred->display("Height", "Weight");
参照を表す演算子として、すでにおなじみの "->" がありますね。実際、上の $fred はオブジェクトへの参照なので、矢印演算子も参照解除の一形態と考えることができます。
矢印の左側に表示される参照やクラス名は、矢印の右側にあるメソッドの第一引数として渡されます。つまり、上のコードはそれぞれ次のように等価となる。
my $fred = Critter::find("Critter", "Fred");
Critter::display($fred, "Height", "Weight");
簡単な例
1. 説明
このプログラムは、Perlでオブジェクト指向プログラミングを行う方法を紹介するものです。このデモプログラムは、person.pl と person.pm という二つのファイルを含んでいます。person.pl と person.pm をカレントディレクトリに置き、 "perl person.pl" を実行すると、結果を見ることができます。 person.pm は person という名前のクラスを定義しています。
2. person.pmの内容
#! /usr/bin/perl -w
package person;
use strict;
sub new {
my $class = shift();
print("CLASS = $class\n");
my $self = {};
$self->{"name"} = shift();
$self->{"sex"} = shift();
bless $self, $class;
return $self;
}
sub getName {
my ($self) = @_;
return $self->{"name"};
}
sub setName {
my ($self, $name) = @_;
$self->{"name"} = $name;
}
sub getSex {
my ($self) = @_;
return $self->{"sex"};
}
sub setSex {
my ($self, $sex) = @_;
$self->{"sex"} = $sex;
}
3. person.plの内容
#! /usr/bin/perl -w
use strict;
use person;
sub main()
{
my $tom = person->new("Tom", "male");
my $kiss = person->new("Kiss", "female");
my @persons = ($tom, $kiss);
for my $p (@persons) {
printf("NAME: %s\tSEX: %s\n", $p->getName(), $p->getSex());
}
}
&main();
4. プログラムを実行した結果
CLASS = person
CLASS = person
NAME: Tom SEX: male
NAME: Kiss SEX: female
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン