对象只是一个引用(也就是一个scalar变量),它恰好知道自己属于哪个类。要告诉一个引用它所指向的内容属于哪个类,使用。要知道引用所指向的内容属于哪个类(如果有的话),使用
[ref](http://perldoc.perl.org/functions/ref.html)
。方法只是一个子程序,接受对象(或者对于类的方法,就是包名)作为第一个参数。使用
$obj->method()
可以调用对象的方法,用Package::Name->method()
可以调用类的方法。(译者注:所谓类的方法,在其他语言里就相当于类的静态方法。)类就是包含一组方法的包。
下面有个简短的例子来帮助我们弄清楚这些概念。示例模块Animal.pm
包含Animal
类,内容如下:
require Animal;
"legs" => 4,
"colour" => "brown",
}; # $animal是一个普通的hash的引用
print ref $animal; # "HASH"
print ref $animal; # "Animal"
注意:任何引用都可以被转换(bless)成任何类的对象。需要由你来保证(1)这个引用指向的内容可以被当做这个类的对象来使用,并且(2)被转换成的这个类存在,并且已经被加载了。
你仍然可以按以前的方式操作这个hash:
但你也可以同样用->
运算符调用这个对象的方法,就像这样:
$animal->eat("insects", "curry", "eucalyptus");
最后那句调用等价于Animal::eat($animal, "insects", "curry", "eucalyptus")
。
构造函数
然后像下面这样使用:
继承
要创建一个类继承自基类,用use parent
,假设我们给Animal
创建一个子类叫Koala
,位于Koala.pm
:
下面是一些示例程序:
use strict;
use warnings;
require Koala;
my $koala = Koala->new();
最后那个方法调用尝试执行Koala::eat($koala, "insects", "curry", "eucalyptus")
,但子程序eat()
并没有在Koala
包里定义。然而,因为Koala
有父类Animal
,Perl解释器会再尝试调用Animal::eat($koala, "insects", "curry", "eucalyptus")
,这回没问题。请注意Animal
类是如何自动被加载的。