Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190132
  • 博文数量: 29
  • 博客积分: 731
  • 博客等级: 上士
  • 技术积分: 435
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-06 16:18
文章分类

全部博文(29)

文章存档

2012年(29)

分类: Python/Ruby

2012-03-28 00:18:37

简单的OOL

在Perl中方法有二种,
实例方法:用于特定对象的方法,实现执行某个功能.
类方法:用于整个类的方法
类的多态性:总是某个类型的特定对象选择最合适的行为的特性叫多态性
构造器: 类中生成对象实例的方法叫构造器

简单的讲perl的对象
对象只不过是一个引用….嗯,引用物
类就是包
方法就是子例程:方法和普通子例程的区别是,它们的包在什么时候被解析,子例程的包是程序开始运行之前,编译时就解析的.但方法是在调用时才解析

方法调用
方法是对象的核心,提供了一个抽象层,不是直接访问对象中的一块数据区,而是调用实例的方法.只是,不在是直接调用包中的子例程,而是调用一个类的方法.
调用者(invocant):对类来讲,调用者是包的名字,对实例方法来讲,调用者是指定对象的引用.换句话讲,调用者就是调用方法的那种东西,有的文章叫他为代理(agent)施动者(actor).
INVOCANT->METHOD(LIST)
在调用时先定位由INVOCANT和METHOD名字的类共同确定的子例程.然后调用这个子例程,并将INVOCANT传递给它作为第一个参数. 这时,如果INVOCANT是一个引用,我们就讲这是以实例方法调用的,但当它是一个包名字时,就看看成一个类方法.

 
构造对象:
package Critter;
  sub spawn {
      my $self={};          #指向一个空的匿名散列
      bless $self, "Critter";      #给散列作成一个Critter对象
      return $self;          #返回新生成的Critter
  }
  $pet = Critter->spawn;          #创建
 
创建类:
方法一:
 
sub new {
      my $invocant = shift;                      #类名称
      my $class = ref($invocant) || $invocant;   #判断是不是引用
      my $self = {                               #对象属性
          color => "bay",
          legs => 4,
          owner => undef,
          @_,   #剩下的参数(hash)变成属性,写在最后面有相同的参数时,正好可以磛盖以前的属性
      };
      return bless $self,$class;      #new方法一般只return bless对象属性到所有方法
    }

$stallion = Horse->new(color => "black");    #调用类
 
方法二:

use vars qw(@ISA); # 这一句用于 inheritance,也可以省略
sub new {
    my ($class, $args) = @_;  
    my $self = bless {
        'fname' => $first,
        'lname' => $last,
        'id' => $id,
        'mother' => $mother,
        'father' => $father,
    }, $class;
    return $self;
}
 
sub father {
    my ($self, $args) = @_;
    return $self->{'father'};
}
sub id { return shift->{'id'} }
1;
 
 
类继承
 package Horse;
     our @ISA = "Critter"; #当在Horse中调用没有时,就会到Critter中查找相关的方法.
 
继承例子:
PM file:
 
package M1;
sub new {
    my $class = shift;
    $class = ref($class) || $class;
    my $self = {
        "name" => "jophy",
        "race" => "unknown",
        "weight" => "",
        @_,
    };
    return bless $self, $class;
}
sub get_name {
    my $self = shift;
    return $self->{name};
}
1;
package M2;
our @ISA = qw/M1/;         #继承package M1
sub get_race {
    my $class = shift;
    $class = ref($class) || $class;
    my $self = {};
    bless $self, $class;
    my ($arg) = @_;
}
1;
 
perl script:
 
use pmfile;             #pm文件名
my $oo = M2->new();
print $oo->get_name('12');

 
 
    

阅读(1866) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:php开发中的一些小技巧

给主人留下些什么吧!~~

无色T恤2012-03-28 22:44:14

方法是对象的核心!