--- title: Perlのオブジェクト指向 author: kazu634 date: 2008-10-11 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4333;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl ---
Perlでオブジェクト指向をする方法を学ぶ。テキストは『すぐわかる オブジェクト指向 Perl』。Perlの偉い人もお勧めしていた本だよ。
Javaとかで簡単なオブジェクト指向を学んでいる人であれば、今回の自分用メモを読むとPerlでクラスを作成するポイントがわかる…と思います。はい。
静的なクラスというのはコンストラクタなんかでインスタンス化しなくても使えるクラス…というような雰囲気を感じる。違うかもしれないけれど。。。
とりあえず三角形の面積を求めるクラスを作るのだけれど、
というような継承関係をしているとして、以下のソースをご覧ください:
use strict; use warnings; # Must specify the package name! package Figure; sub AUTOLOAD { my ($class, @rest) = @_; our $AUTOLOAD; warn "You are about to invoke $AUTOLOAD using the argument ", join(', ', @rest), ".\n"; warn "But I don't know how to do it!\n"; return "UNKNOWN"; } 1;
スーパークラスとして存在するクラス。packageで名前空間としてFigureを指定している。AUTOLOADは存在しないメソッド呼び出しがあったときに、それを引き受けるための専用のメソッド。
use strict; use warnings; # Must specify the package name! package Triangle; use base 'Figure'; # Must include these 3 lines below. It's a convention! sub space { my ($class, $a, $b, $c) = @_; my $s = ($a + $b + $c) / 2; my $space = sqrt($s * ($s - $a) * ($s - $b) * ($s - $c)); return $space; } 1;
継承をするときは
use base 'module name';
もしくは
use base qw(module name);
とする。
use strict; use warnings; # Must specify the package name! package RegularTriangle; use base 'Triangle'; sub space { my ($class, $a) = @_; $class->SUPER::space($a, $a, $a); } 1;
継承している一つ上のクラスを指すには「SUPER」を用いる。
# === Libraries === use strict; use warnings; use Triangle; use RegularTriangle; # === Main part === my $a = 3; my $b = 4; my $c = 5; my $space = Triangle->space($a, $b, $c); print("Triangle: $space\n"); $a = 6; $space = RegularTriangle->space($a); print("Regular_Triangle: $space\n"); $space = Triangle->aaa($a);
クラスのメソッド呼び出しには「クラス名->メソッド名」を用いる。
use strict; use warnings; # Must specify the package name! package xxx; # Inheritance from ... # use base qw(module name); # If you use the module(s), you must put here: use Carp qw(croak); # extended debug module # === Constructor ====================================== # You can name the constructor any names you want. # But, it's a convention to name the constructor new. # ====================================================== # sub new { # my ($class, $a, $b, $c) = @_; # my $self = { # a => $a, # b => $b, # c => $c, # }; # bless $self, $class; # return $self; # } # === Deconstructor === # sub DESTROY { # } # =============================================================== # If you write a super class, # it is recommended that you should write an AUTOLOAD method. # =============================================================== # sub AUTOLOAD { # } 1;