您可以重新bless返回的對象無論你的心臟的慾望:
#!/usr/bin/perl
package Some::Data;
use strict; use warnings;
sub new { my $class = shift; bless { @_ } => $class }
sub a { $_[0]->{a} }
package My::Data;
use strict; use warnings;
use base 'Some::Data';
sub a_squared {
my $self = shift;
my $v = $self->a;
return $v * $v;
}
package Some::Parser;
use strict; use warnings;
sub new { my $class = shift; bless { @_ } => $class }
sub parse { return Some::Data->new(a => 3) }
package main;
use strict; use warnings;
my $data = Some::Parser->new->parse;
bless $data => 'My::Data';
printf "%.1f\t%.1f\n", $data->a, $data->a_squared;
或者,您可以使用@軍事審判的想法:
#!/usr/bin/perl
package Some::Data;
use strict; use warnings;
sub new { my $class = shift; bless { @_ } => $class }
sub a { $_[0]->{a} }
package My::Data;
use strict; use warnings;
use base 'Some::Data';
sub a_squared {
my $self = shift;
my $v = $self->a;
return $v * $v;
}
package Some::Parser;
use strict; use warnings;
sub new { my $class = shift; bless { @_ } => $class }
sub parse {
my $self = shift;
return $self->data_class->new(a => 3);
}
sub data_class { $_[0]->{data_class} }
package main;
use strict; use warnings;
my $data = Some::Parser->new(data_class => 'My::Data')->parse;
printf "%.1f\t%.1f\n", $data->a, $data->a_squared;
由於我還處於早期階段,現在是重新考慮我的策略的最佳時機......這就是爲什麼我要問了!我一直在閱讀很多關於祝福的文章,而且人們一直在警告重新出現對象。如果新的對象類擴展了原始類,這會不會成爲一個問題? – 2010-10-28 21:58:45
我認爲延長原來的課程可能是最好的方式。 (只要原始類很容易擴展,如果這是一個小問題,不要發瘋,重新祝福可以解決它)。你可以在你的派生類中編寫自己的構造函數,它可以保存對象。你的構造函數可能需要先調用父類的構造函數,然後重新祝福,這相當於同樣的事情,但提供了一個更好的接口。 – friedo 2010-10-28 22:06:05