perl的面象对象笔记
转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]
本文链接: http://www.php-oa.com/2009/09/06/perl-oo.html
简单的OOL
在Perl中方法有二种,
实例方法:用于特定对象的方法,实现执行某个功能.
类方法:用于整个类的方法
类的多态性:总是某个类型的特定对象选择最合适的行为的特性叫多态性
构造器: 类中生成对象实例的方法叫构造器
简单的讲perl的对象
对象只不过是一个引用….嗯,引用物
类就是包
方法就是子例程:方法和普通子例程的区别是,它们的包在什么时候被解析,子例程的包是程序开始运行之前,编译时就解析的.但方法是在调用时才解析
方法调用
方法是对象的核心,提供了一个抽象层,不是直接访问对象中的一块数据区,而是调用实例的方法.只是,不在是直接调用包中的子例程,而是调用一个类的方法.
调用者(invocant):对类来讲,调用者是包的名字,对实例方法来讲,调用者是指定对象的引用.换句话讲,调用者就是调用方法的那种东西,有的文章叫他为代理(agent)施动者(actor).
INVOCANT->METHOD(LIST)
在调用时先定位由INVOCANT和METHOD名字的类共同确定的子例程.然后调用这个子例程,并将INVOCANT传递给它作为第一个参数. 这时,如果INVOCANT是一个引用,我们就讲这是以实例方法调用的,但当它是一个包名字时,就看看成一个类方法.
1 2 | $mage = Wizard->summon("Gandalf"); #类方法 $mage->speak("friend"); #实例方法 |
构造对象
bless: 所有的对象都是引用,但不是所有的引用都是对象.引用不会作为对象运转,除非引用它的东西有个特殊的标记告诉perl它属于哪个包.给引用和包名字标记起来(因此也和包中的类标记起来了.因为一个类就是一个包)的这个动作被称作为bless.这是给该引用转换成一个对象引用.
bless函数接收一个(二个)参数.第一个是参数的引用.第二个是要给引用bless成的包(如果没有这个参数,就是当前包). 一旦bless了引用物.使用内置的ref函数时会返回bless了的类的名字.不会出现内置类型.如(HASH).所以可以使用attributes模块中的reftype来做测试.
1 2 3 4 5 6 7 8 | package Critter; sub spawn { my $self={}; #指向一个空的匿名散列 bless $self, "Critter"; #给散列作成一个Critter对象 return $self; #返回新生成的Critter } $pet = Critter->spawn; #创建 |
初启程序 让构造器接收一些参数.并给他们当成键值对(别的文章叫这个为性质,属性,存取器实例数据,实例变量之类).
1 2 3 4 5 6 7 8 9 10 11 12 | sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, #剩下的参数变成属性,写在最后面有相同的参数时,正好可以磛盖以前的属性 } return bless $self,$class; } $stallion = Horse->new(color => "black"); |
类继承
perl中实现主要是通过包的@ISA数组中的每个元素都保存另外一个包的名字,当没有这个方法时,就查找这个包. 如:Horse类变成Critter类的子类.
1 2 | package Horse; our @ISA = "Critter"; #当在Horse中调用没有时,就会到Critter中查找相关的方法. |


















