- Perl ›
- オブジェクト指向プログラミング ›
- here
継承
Perlにおける継承について解説します。
継承とは
一般的な継承の解説については「継承 - Wikipedia」をご覧ください。
継承の種類
Perlは、単一継承と多重継承をサポートしています。
単一継承
継承において、親クラスがひとつであることを単一継承と呼びます。
多重継承
継承において、親クラスがふたつ以上であることを多重継承と呼びます。
継承のサンプル
継承のサンプルを書きます。単一継承を使って、Pointクラスを継承したPoint3Dクラスを作成しています。
use strict; use warnings; package Point; sub new { my $class = shift; my $self = bless {@_}, $class; $self->{x} //= 0; $self->{y} //= 0; return $self; } # フィールド sub x { my $self = shift; if (@_) { $self->{x} = $_[0]; return $self; } return $self->{x}; } sub y { my $self = shift; if (@_) { $self->{y} = $_[0]; return $self; } return $self->{y}; } # インスタンスメソッド sub move { my $self = shift; my ($x, $y) = @_; $self->{x} += $x; $self->{y} += $y; } package Point3D; use base 'Point'; sub new { my $class = shift; # スーパークラスのコンストラクタの呼び出し my $self = $class->SUPER::new(@_); $self->{z} //= 0; return $self; } sub z { my $self = shift; if (@_) { $self->{z} = $_[0]; return $self; } return $self->{z}; } # オーバーライド sub move { my $self = shift; my ($x, $y, $z) = @_; $self->SUPER::move($x, $y); $self->{z} += $z; } package main; my $point = Point3D->new(x => 5, y => 10, z => 3); $point->move(4, 2, 5); print $point->x . "\n"; print $point->y . "\n"; print $point->z . "\n";
継承の解説
上記のサンプルを使って、継承を解説します。
継承
baseモジュールを使って、Point
クラスを継承した、Point3D
クラスを作成します。
package Point3D; use base 'Point';
継承によって、Point3Dクラスは、Pointクラスのメソッドを呼び出すことができます。
スーパークラスのコンストラクタの呼び出し
スーパークラスPointのコンストラクタを呼び出しています。スーパークラスのコンストラクタは、SUPERを使って呼び出すことができます。
# Point3D->new sub new { my $class = shift; # スーパークラスのコンストラクタの呼び出し my $self = $class->SUPER::new(@_); $self->{z} //= 0; return $self; }
独自のアクセッサの定義
Point3D独自のアクセッサを実装することもできます。
# Point3D->z sub z { my $self = shift; if (@_) { $self->{z} = $_[0]; return $self; } return $self->{z}; }
メソッドオーバーライド
メソッドをオーバーライドして、Pointクラスのメソッドをカスタマイズしたメソッドを実装することもできます。スーパークラスのメソッドは、SUPERを使って呼び出すことができます。
# オーバーライド # Point3D->move sub move { my $self = shift; my ($x, $y, $z) = @_; $self->SUPER::move($x, $y); $self->{z} += $z; }