- Perlについての質問箱 63箱目
470 :デフォルトの名無しさん[sage]:2016/10/12(水) 08:39:20.39 ID:9k51B2Do - Perlのオブジェクト指向読んだばっかりで理解が曖昧なんだけど、
これだと、オブジェクトがオブジェクトなのか関数なのかって呼び出し側で決める事にならない? コンストラクタもメソッドも。 ついでに、インスタンスのカプセル化どうこうも、呼び出し側の権利? みたいに見えたのですが。
|
- Perlについての質問箱 63箱目
472 :デフォルトの名無しさん[sage]:2016/10/12(水) 14:33:18.63 ID:9k51B2Do - >>471
ありがとう 以下みたいな感じの記述は使っても問題ない? あと穴があった場合も教えて欲しい。 (複数回に分けて書くので途中で書けなくなるかも) use utf8; use strict; use warnings; #ただの実験 # 1: メソッドとインスタンスをカプセル化する。 # 2: クロージャを、あたかもオブジェクト指向と同じ記法で呼び出せるようにする。(クロージャとオブジェクト指向の同一視) # 3: クロージャをクロージャのまま使いたければそうできるようにした。そもそもクロージャのほうが速いので。
|
- Perlについての質問箱 63箱目
473 :デフォルトの名無しさん[sage]:2016/10/12(水) 14:33:37.13 ID:9k51B2Do - {
package Class; sub new{ my $class = $_[0] eq __PACKAGE__ ? shift : undef ; #オブジェクトとして呼び出されたかどうか my $self = { Name => shift, }; my $method = { NameGet => sub{ $self->{Name} }, NameSet => sub{ $self->{Name} = shift; }, }; return $method if(!$class); # 普通の関数(クロージャ)として呼ばれた場合 return bless $method, $class; # オブジェクトとして呼ばれた場合 } sub AUTOLOAD { our $AUTOLOAD; my $method = shift; ref($method) eq __PACKAGE__ or return("error"); my @load = split '::', $AUTOLOAD; my $load = $load[-1]; $method->{$load}->(@_); } }
|
- Perlについての質問箱 63箱目
474 :デフォルトの名無しさん[sage]:2016/10/12(水) 14:34:03.93 ID:9k51B2Do - {
package test; my $c = Class::new("Closure"); #クロージャとして呼び出すと、一般的なクロージャと同じように使える。 print $c->{NameGet}->() . "\n"; my $o = Class->new("Object"); #オブジェクト指向として呼び出すと、オブジェクト指向と同じように使える。(中身はクロージャ) print $o->NameGet() . "\n"; print Class::NameGet(); #関数のように呼ぶとエラー } __END__ 以上です
|
- Perlについての質問箱 63箱目
476 :デフォルトの名無しさん[sage]:2016/10/12(水) 21:51:13.12 ID:9k51B2Do - やりかたがあると言うのなら、提示して欲しいのだけど。(ただの俺は知ってるぞ自慢?)
事前に試しましたが、継承はできましたよー。 複数クラスを書くと長くなるので書きませんが、 まったく同じように別のクラスを書いて、ベースにしたいクラスを呼び出して更新すれば とりあえずインスタンスもメソッドは継承されるですね。 あと穴は一つ発見しました。 これは後出しにしようかな。
|