perl 的Class::MethodMaker

来源:互联网 发布:mac队全灭动态图解 编辑:程序博客网 时间:2024/06/03 12:57

看到perl inter 进展缓慢,不过也不着急,看看这个模块的文档吧,虽然现在有很多OO的模块,我先看这个的。

基础牢固了再去看那些复杂的,后面想看看anyevent,template tootkit ,dancer ,mojo, catalyst, PSGI/Plack.好多啊....

大概翻译如下,有点混乱。

名称:

Class::MethodMaker -为perl面向对象编程创建泛型方法。

内容简介:

 use Class::MethodMaker    [ scalar => [qw/ foo bar baz /],      new    => [qw/ new /]        ,    ];

都是 use  Class::MethodMaker

        [

componet => [option, 'method' ],

]

这种形式,下面具体介绍一下 组件,选项,方法名称是自己设置的。


描述:

This module solves the problem of having to continually write accessor methods for your objects that perform standard tasks.

本模块能解决如下问题:不断给对象编写辅助方法(如set_sth get_sth),减少工作量。

The argument to 'use' is an arrayref, as pairs whose "keys" are the names of types of generic methods generated by MethodMaker and whose "values" tell method maker what methods to make.

Use的参数 是一个数组引用,数组中参数成对出现,键是泛型方法的类型名,值是告诉方法创造者创造什么方法。

To override any generated methods, it is sufficient to ensure that the overriding method is defined when Class::MethodMaker is called. Note that the use keyword introduces a BEGIN block, so you may need to define (or at least declare) your overriding method in a BEGIN block.

为了重载任意继承的方法,它充分保证了重载的方法会在 Class::MethodMaker被调用时被定义。注意:use关键字接受一个BEGIN块,所以你需要定义你重载的方法在BEGIN块里。

简单用法:

一个简单的使用Class::MethodMaker的类如下:

  package MyClass;

  use Class::MethodMaker

    [ scalar => [qw/ name /],

      new    => [qw/ new  /],

    ];

所创建的类,使用new 创建实例,每个实例有一个 叫name的 标量组件。 使用方法name,name_reset name_isset 可以 查询,设置或重置 name

  package main;

  my $m = MyClass->new;

  my $n;

  $\ = "\n";

  print $m->name_isset ? "true" : "false";     # false

  $m->name("foo");

  $n = $m->name;

  print defined $n ? "->$n<-" : "*undef*";     # ->foo<-

  print $m->name_isset ? "true" : "false";     # true

  $m->name(undef);

  $n = $m->name;

  print defined $n ? "->$n<-" : "*undef*";     # *undef*

  print $m->name_isset ? "true" : "false";     # true

  $m->name_reset;

  $n = $m->name;

  print defined $n ? "->$n<-" : "*undef*";     # *undef*

  print $m->name_isset ? "true" : "false";     # false

可用的组件类型包括 scalararrayhash。还有几种非数据类型的用法:new(构造器),deep_copy copy(对象拷贝), abstract(创建抽象方法(纯虚函数))

由于pod上没有介绍非数据类型的选项配合方法,下面是数据类型组件的一些选项:

 需要参数的选项,用{}括起来,不需要的参数的如static 可以直接单独写出,这些选项作用于最近的一个方法;

多个方法可以连续写在一个里面;


每个组件(数据组件)有一些选项: 

-static 每个类而非每个实例的数据。

-type 规定数据的类型  type后面接 类名。

-forward  调用 数据对象的相应方法

  package X;

  use Class::MethodMaker

    [scalar => [{ -type => 'File::stat',

                  -forward => [qw/ mode size /], },

                'st1',

               ],

])},

Package main;

use File::stat; 

my $a= X->new; 

my $file=stat(“/etc/tmp”);

$a->stl($file);

$a->size; # forward to $file->size;

-default/-default_ctr 设置默认值,默认的coderef

-read_cb/-store_cb (略)


最后附上自己的测试代码:

 use File::stat; use strict;{package animal; use File::stat;use Class::MethodMaker [    new => [qw(new)],array => 'ab',scalar => [  +{-default => 'brown'},'color' ,qw(height age name )],scalar => [ { -type => 'File::stat', -forward=>[qw/mode size/] },'hehe',],abstract =>[qw(sound)],];sub named {my $self = shift->new;$self->name(shift);$self;}sub speak{my $self = shift;print $self->name,' goes ', $self->sound,"\n";}sub eat{my $self = shift;my $food = shift;print $self->name, " eats $food \n";}}local $\ ="\n";my $a= animal->named('lily');print $a->name,"\n";print $a->ab(1,4),"\n";$a->eat("banana");print $a->color;my $w= stat("d://1.txt");$a->hehe($w);print $a->size;

总结:

     看的头晕眼花,四肢乏力,这个模块确实节约很大力气再设置accesor上面。

     不过,关于new的设置不知道是个什么情况。

      intermediate perl 159页的代码和这个有出入,也许是版本问题吧,就先不管那么多了,目的一致即可,还有更多更好的OO模块,以后慢慢学习。