perl的面象对象笔记

Sep 6th, 2009

转载本站文章请注明,转载自:扶凯[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中查找相关的方法.
Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
Tags: ,
No comments yet.