【Perl】クロージャで継承
クロージャの概念をクラスとの対比でわかりやすく説明する
2008年の記事なので、もう解決してそうな気がしますが。
こうすると、継承っぽくオーバーライドっぽく見えそうですがどうでしょう。
またはこうか。
後、クロージャは言葉がカッコいい(厨)
クロージャは、継承できないと書きましたが継承できるみたいです。(やりかたは今のところは思いつきません。)
2008年の記事なので、もう解決してそうな気がしますが。
1 use v5.14.0; 2 use warnings; 3 4 sub test1::new { 5 my $class = shift; 6 my $data = 0; 7 my $obj = { 8 data => sub { $data = $_[0] if @_ >= 1; $data }, 9 say => sub { say "say" }, 10 }; 11 } 12 13 sub test2::new { 14 my $class = shift; 15 my $base = test1->new; 16 my $obj = { 17 %$base, 18 say => sub { say "sei" }, 19 get => sub { $base->{data}->() }, 20 }; 21 } 22 23 my $t1 = test1->new; 24 my $t2 = test2->new; 25 $t1->{data}->(10); 26 $t2->{data}->(20); 27 28 say $t1->{data}->(); 29 $t1->{say}->(); 30 say $t2->{data}->(); 31 $t2->{say}->(); 32 say $t2->{get}->(); 33 say $t1->{data}->(); 34 $t1->{say}->();
こうすると、継承っぽくオーバーライドっぽく見えそうですがどうでしょう。
またはこうか。
1 use v5.14.0; 2 use warnings; 3 4 sub test1::new { 5 my $obj = {}; my $class = shift; 6 my $data = 0; 7 $obj->{data} = sub { $data = $_[0] if @_ >= 1; $data }; 8 $obj->{say} = sub { say "say" }; 9 $obj; 10 } 11 12 sub test2::new { 13 my $base = test1->new; 14 my $obj = {%$base}; my $class = shift; 15 $obj->{say} = sub { say "sei" }; 16 $obj->{get} = sub { $obj->{data}->() }; 17 $obj; 18 } 19 20 my $t1 = test1->new; 21 my $t2 = test2->new; 22 $t1->{data}->(10); 23 $t2->{data}->(20); 24 25 say $t1->{data}->(); 26 $t1->{say}->(); 27 say $t2->{data}->(); 28 $t2->{say}->(); 29 say $t2->{get}->(); 30 say $t1->{data}->(); 31 $t1->{say}
後、クロージャは言葉がカッコいい(厨)