Perl: モジュール化(クラス化)してオブジェクト指向プログラミング

クラス(モジュール)を作成し、サブクラスをさらに作成するサンプル。

モジュールは拡張子 .pm になる。

Point.pm

package Point;

use strict;
use warnings;

# コンストラクタは便宜的に new という名前
# my $point = Point->new(x=>2, y=>3);
sub new {
    my $class = shift();
    my $self = {
        x => 0,
        y => 0,
        @_
    };
    return bless($self, $class);
}

# $point->x とすれば x の値が取れる
# $point->x(0) とすれば x の値を 0 にできる
sub x {
    my $self = shift();
    if (@_) {
        $self->{x} = $_[0];
    } else {
        return $self->{x};
    }
}

# $point->y とすれば y の値が取れる
# $point->y(0) とすれば y の値を 0 にできる
sub y {
    my $self = shift();
    if (@_) {
        $self->{y} = $_[0];
    } else {
        return $self->{y};
    }
}

# 値をクリアして 0 にする
# $point->clear();
sub clear {
    my $self = shift();
    $self->x(0);
    $self->y(0);
}

# モジュールは最後にこれを付ける
1;

Point3D.pm

package Point3D;

# 継承
use base "Point";

# コンストラクタは便宜的に new という名前
# my $point3 = Point3D->new(x=>2, y=>3, z=>4);
sub new {
    my $self = shift()->SUPER::new(@_);
    $self->z = 0 unless exists $self->{z};
    return $self;
}

# $point3->z とすれば z の値が取れる
# $point3->z(0) とすれば z の値を 0 にできる
sub z {
    my $self = shift();
    if (@_) {
        $self->{z} = $_[0];
    } else {
        return $self->{z};
    }
}

# 値をクリアして 0 にする
# $point3->clear();
sub clear {
    my $self = shift();
    $self->SUPER::clear;
    $self->z(0);
}

# モジュールは最後にこれを付ける
1;

point.pl

use strict;
use warnings;

use Point;
use Point3D;

# Point
my $point = Point->new(x=>2, y=>3);
print("[".$point->x.",".$point->y."]\n");
$point->clear();
print("[".$point->x.",".$point->y."]\n");
$point->y(4);
print("[".$point->x.",".$point->y."]\n");

# Point3D
my $point3 = Point3D->new(x=>2, y=>3, z=> 4);
print("[".$point3->x.",".$point3->y.",".$point3->z."]\n");
$point3->clear();
print("[".$point3->x.",".$point3->y.",".$point3->z."]\n");

出力

[2,3]
[0,0]
[0,4]
[2,3,4]
[0,0,0]