面向对象的perl 3
如何使用instance variabl实例变量
什么是实例变量, 实例变量就是和实例关联的变量。 不同的对象的实例变量是在不同的
namespace里的,就是说是互无关系的, 是私有财产。与其相对的是类变量,她是公有的。
说到这里要提一下前面一节中提到的构造器。在前面提到的所有的构造器中,我们都用了一
个匿名哈西作为bless的参数,是否哈西有什么神奇的地方呢?实际上我们可以bless任何一
个东西的ref. scalar, array, hash, sub, typeglob. 使用哈西的目的是,她的键/值对
可以更方便的表达实例变量。
下面举一个例子说明具体是怎么管理实例变量的
package Hero;
sub new{
my $class = shift;
my $self = {@_}; # 这里和前面不同
bless $self, $class;
return $self;
}
sub getName{
my $hero = shift;
return $hero->{name};
}
---------------------------------------------------
use Hero;
my $refHero = Hero-new(name="wti"); # create a hero whose name is wti
print $refHero-getName; # here will get wti ;)
---------------------------------------------------
如前面一节所述,使用->时传给new的参数实际上是("Hero",name=>"wti"),知道这点,
上面的代码就很好理解了。 $class 先取出了“Hero", 之后的东西就到了{}里。这个时候
$self 就是 {name=>"wti"}; $self 又在构造一个新Hero的时候传给了$refHero。
下面 $refHero->getName; 调用实例函数(以后会讲)同样用了->, 传给getName的参数表
是($refHero), 到了getName里, $refHero传给了$hero, $hero现在是一个哈西的引用,
其哈西是{name=>"wti"}. 就此getName终于返回了Hero的名字“wti":).
下面的代码和上面的效果是一样的,作为练习大家自己分析吧!(注意,这里体现出哈西的长处了,
如果用数组,你就要有很好的记忆,记住各个属性在数组的第几位)
package Hero;
sub new{
my $class = shift;
my $self = [@_]; # 这里和前面不同
bless $self, $class;
return $self;
}
sub getName{
my $hero = shift;
return $hero->[0];
}
1;
---------------------------------------------------
use Hero;
my $refHero = Hero-new("wti"); # create a hero whose name is wti
print $refHero-getName; # here will get wti ;)
---------------------------------------------------