- 论坛徽章:
- 89
|
本帖最后由 fender0107401 于 2013-11-13 19:58 编辑
有个问题,我有点想不清楚。
那就是在 Perl 里面,我使用 Moose 的时候 derived_class 的 constructor 和 base_class constructor 之间的关系问题。
显然,在Perl这种高级语言里面,没有必要讨论copy constructor,所以此处不考虑copy constructor。
示例代码:
base_class.pm
- package base_class;
- use v5.14;
- use Moose;
- has 'foo' => (isa => 'Str', is => 'rw');
- sub BUILD
- {
- my $this = shift @_;
- $this->generate_foo;
- }
- sub DEMOLISH
- {
- # Nothing.
- }
- no Moose;
- 1;
复制代码 derived_class.pm- package derived_class;
- use v5.14;
- use Moose;
- extends 'base_class';
- sub BUILD
- {
- # Nothing.
- }
- sub DEMOLISH
- {
- # Nothing.
- }
- sub generate_foo
- {
- my $this = shift @_;
- my $foo = 'Hi, I am foo.';
- $this->foo($foo);
- return $this;
- }
- sub show_foo
- {
- my $this = shift @_;
- print $this->foo;
- print "\n";
- }
- no Moose;
- 1;
复制代码 main.pl
- #! /usr/bin/perl
- use v5.14;
- use derived_class;
- my $derived_ob = derived_class->new;
- $derived_ob->show_foo;
复制代码 run result- 我确定的东西:
- derived_class的对象,在创建的时候,是会调用base_class里面定义的BUILD函数的。
- derived_class的对象,在销毁的时候,是会调用base_class里面定义的DEMOLISH函数的。
- 我发现的问题:
在上面的示例代码里面,bass的BUILD函数会调用generate_foo来设定foo的初始值,但是generate_foo这个函数是定义在derived_class里面的。由于derived_class的对象在调用自己的BUILD的时候会调用到base_class的BUILD,而base_class的BUILD会调用到generate_foo,所以foo的值被设定了。
换句话说,base_class的BUILD是可以调用到derived_class里面的generate_foo函数的。我感觉很疑惑,毕竟generate_foo是定义在derived_class里面的。
|
|