Perl には、オブジェクト指向プログラミングの 2 つの異なる実装があります。
1 つは匿名ハッシュ テーブル メソッドに基づいており、各オブジェクト インスタンスの本質は匿名ハッシュ テーブルを指す参照です。この匿名ハッシュ テーブルには、すべてのインスタンス属性が保存されます。
2 つ目は、配列ベースのメソッドです。クラスを定義するときに、各インスタンス属性の配列を作成します。各オブジェクト インスタンスの本質は、これらの配列内の行インデックスを指す参照です。これらの配列には、すべてのインスタンスのプロパティが保存されます。
オブジェクト指向には多くの基本概念がありますが、ここではオブジェクト、クラス、メソッドの 3 つを受け入れます。
オブジェクト: オブジェクトは、クラス内のデータ項目への参照です。 。
クラス: クラスは、オブジェクト メソッドを提供するクラスを含む Perl パッケージです。
メソッド: メソッドは Perl サブルーチンであり、クラス名はその最初のパラメータです。
Perl は bless() 関数を提供し、Bless はオブジェクトを構築するために使用され、参照を返すことによってオブジェクトを構築します。
クラスは単なる単純なパッケージです。
パッケージをクラスとして使用したり、パッケージ内の関数をクラスのメソッドとして使用したりできます。
Perl のパッケージは独立した名前空間を提供するため、異なるパッケージ内のメソッド名と変数名が競合することはありません。
Perl クラスのファイル拡張子は .pm です。
次に Person クラスを作成します。
パッケージ人;
クラスのコード範囲は、スクリプト ファイルの最終行、または次のパッケージ キーワードの前に達します。
クラスのインスタンス (オブジェクト) を作成するには、コンストラクターを定義する必要があります。ほとんどのプログラムはクラス名をコンストラクターとして使用しますが、Perl では任意の名前を使用できます。
さまざまな Perl 変数を Perl オブジェクトとして使用できます。ほとんどの場合、参照配列またはハッシュを使用します。
次に、Perl のハッシュ参照を使用して、Person クラスのコンストラクターを作成します。
オブジェクトを作成するときは、オブジェクトへの参照を返すサブルーチンであるコンストラクターを提供する必要があります。
例は次のとおりです。
次にオブジェクトを作成します。
$object = 新しい人( "シャオミン", "王", 23234345);
Perl クラスのメソッドは単なる Perl サブルーチンであり、一般にメンバー関数として知られています。
オブジェクト指向 Perl での Perl のメソッド定義では特別な構文は提供されませんが、メソッドの最初のパラメータがオブジェクトまたはその参照パッケージであることが規定されています。
Perl はプライベート変数を提供しませんが、補助メソッドを通じてオブジェクト データを管理できます。
次に、名前を取得するメソッドを定義します。
sub getFirstName { return $self->{_firstName};}
次のように書くこともできます。
sub setFirstName { my ( $self, $firstName ) = @_; $self->{_firstName} = $firstName が定義されている場合は $self->{_firstName};}
次に、Person.pm ファイルのコードを次のように変更します。
employee.pl スクリプト コードは次のとおりです。
上記のプログラムを実行すると、出力結果は次のようになります。
$ perl member.pl 名前: Xiao Ming 姓: Wang Number: 23234345 設定前の名前: Xiao Ming 設定後の名前: Xiao Qiang
Perl のクラス メソッドは、@ISA 配列を通じて継承されます。この配列には、他のパッケージ (クラス) の名前が含まれます。変数の継承は明示的に設定する必要があります。
多重継承とは、@ISA 配列に複数のクラス (パッケージ) 名が含まれることを意味します。
@ISA を通じて継承できるのはメソッドのみであり、データは継承できません。
次に、Person クラスを継承する Employee クラスを作成します。
Employee.pm ファイルのコードは次のようになります。
これで、Employee クラスには Person クラスのすべてのメソッドとプロパティが含まれるようになり、main.pl ファイルに次のコードを入力して実行します。
上記のプログラムを実行すると、出力結果は次のようになります。
$ perl main.pl 名前: Xiao Ming Surname: Wang Number: 23234345 設定前の名前: Xiao Ming 設定後の名前: Xiao Qiang
上記の例では、Employee クラスは person クラスを継承していますが、 person クラスのメソッドがニーズを満たせない場合は、メソッドを書き直す必要があります。
次に、いくつかの新しいメソッドを Employee クラスに追加し、Person クラスのメソッドをオーバーライドします。
main.pl ファイルに次のコードを入力して実行します。
上記のプログラムを実行すると、出力結果は次のようになります。
$ perl main.pl 名前: Xiao Ming 姓: Wang 番号: 23234345 設定前のサブクラス関数の名前: Xiao Ming 設定後のサブクラス関数の名前: Xiaoqiang
要求されたメソッドが現在のクラス、現在のクラスのすべての基本クラス、および UNIVERSAL クラスで見つからない場合は、AUTOLOAD() という名前のメソッドが再度検索されます。 AUTOLOAD が見つかった場合は、それが呼び出され、グローバル変数 $AUTOLOAD が、見つからないメソッドの完全修飾名に設定されます。
それが機能しない場合、Perl はエラーで失敗します。
基本クラスの AUTOLOAD を継承したくない場合は、非常に簡単で、次の 1 つの文だけです。
サブオートロード。
オブジェクトへの最後の参照が解放されると、オブジェクトは自動的に破棄されます。
破棄中に何かをしたい場合は、クラス内に「DESTROY」という名前のメソッドを定義できます。適切なタイミングで自動的に呼び出され、必要に応じて追加のクリーンアップ アクションを実行します。
package MyClass;...sub DESTROY{ print "MyClass::DESTROY が呼び出されましたn";}
Perl はオブジェクト参照を唯一のパラメータとして DESTROY に渡します。この参照は読み取り専用であることに注意してください。つまり、$_[0] にアクセスして変更することはできません。 (翻訳者注: perlsub を参照) しかし、オブジェクト自体 (「${$_[0]」、「@{$_[0]}」、「%{$_[0]}」など) は次のことができます。まだ書かれています。
デストラクターが戻る前にオブジェクト参照を再ブレスすると、Perl はデストラクターが戻った後に再ブレスしたオブジェクトの DESTROY メソッドを呼び出します。これにより、基本クラスまたは指定した他のクラスのデストラクターを呼び出すことができます。 DESTROY は手動で呼び出すこともできますが、通常はそうする必要はないことに注意してください。
現在のオブジェクトが解放されると、現在のオブジェクトに含まれる他のオブジェクトが自動的に解放されます。
次の例を通じて、Perl のオブジェクト指向アプリケーションをさらに理解できます。
上記のプログラムを実行すると、出力結果は次のようになります。
MyClass メソッドを呼び出します。 MyClass::new が呼び出されます。MyClass::MyMethod が呼び出されます。 MySubClass メソッドが呼び出されます。 MySubClass::new が呼び出されます。呼び出されたオブジェクトの作成 MyClass::new 呼び出されたMyClass::DESTROY 呼び出されたスクリプトの実行が終了します...MyClass::DESTROY呼び出されたMySubClass::DESTROY が呼び出されました