blog/content/post/2008-10-11-00001050.md

13 KiB
Raw Blame History

title author date url wordtwit_post_info categories
Perlのオブジェクト指向 kazu634 2008-10-11 /2008/10/11/_1127/
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";}}
Perl

Perlでオブジェクト指向をする方法を学ぶ。テキストは『すぐわかる オブジェクト指向 Perl』。Perlの偉い人もお勧めしていた本だよ。

対象とする読者(というかこれ自分用の備忘録)

Javaとかで簡単なオブジェクト指向を学んでいる人であれば、今回の自分用メモを読むとPerlでクラスを作成するポイントがわかる…と思います。はい。

静的なクラスを作る

静的なクラスというのはコンストラクタなんかでインスタンス化しなくても使えるクラス…というような雰囲気を感じる。違うかもしれないけれど。。。

とりあえず三角形の面積を求めるクラスを作るのだけれど、

  • Figureクラス
    • Triangleクラス
      • Regular Triangleクラス

というような継承関係をしているとして、以下のソースをご覧ください:

Figureクラス

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は存在しないメソッド呼び出しがあったときに、それを引き受けるための専用のメソッド。

Triangleクラス

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);

とする。

RegularTriangleクラス

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);

クラスのメソッド呼び出しには「クラス名->メソッド名」を用いる。

.pmファイルを作るときのテンプレート暫定

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;

疑問点

  • privateがないけど、外部からアクセスできないメソッドを作りたいときはどうするの
    • 無名サブルーチンを使うよ!…でも、なんか美しくない気がする。。。
すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl