perl 在类中建私有成员变量和私有成员函数

perl不像C++、java,在类中可以直接通过private来声明成员私有。

对于成员变量,如果我们在类中直接声明,那么,perl会认为这是一个类变量,即相当于C++里面的static成员变量,该变量被所有类共享,要声明私有,只有通过闭包(closure)的方法。

以下先简单介绍闭包(closure)。

我们可以将闭包理解为一个匿名子程序,其作用就是将其内部的变量封装起来,外部只有通过这个匿名子程序的引用才能访问该变量,闭包声明时,提供了一种方法可以在定义子程序的时候向子程序传递值,也就是初始化子程序。

example:

sub getref_closure{
    my $str1;
    if (@_){
    $str1 = shift;
    }
    else{
    $str1 = "hello";
    }
    return {
        my $str2 = shift;
        print "$str1 $str2/n";
    }
}

例子调用getref_closure来初始化$str1,下一步在子程序中将用户指定字符串或默认字符串Hell存入$str1中,并将返回的匿名子程序到外部引用变量中。

对于类的私有成员变量,我们可以在构造函数中声明一变量,在匿名子程序中使用,并返回给以引用,通过bless方法绑定该引用再返回给用户。

程序例子如下:

sub new{

    print shift,"/n";
    my $data = {};
    $$data{'name'} = "xiaoming";
    my $closure = sub {
        shift;
        if (@_){
            $$data{'name'} = shift;
        }
        else{
            return $$data{'name'};
        }
    };
    bless($closure);
    return $closure;
}

用户通过类的new方法得到一个匿名子程序的引用,也是这个类的对象,此时这个对象里面有一个私有成员变量$$data{'name'},但是用户不能通过$object->data{'name'}来获得,因为$$data{'name'}的作用域限定在new方法和匿名子程序内部。

要访问内部变量,我们有两种方法,一种是直接调用对象方法&{$object}("tttttttttttt"),这样,tttttttt就会传给匿名函数的内部变量。第二种方法是在类中封装一个函数去访问这个匿名函数,如下:

sub name(){
    print "object = $_[0]/n";
    &{$_[0]};
}

通过返回的对象访问:

$object->name("fff");

 

下面说说私有成员函数,如果函数直接在类中定义,那么如C++的公有成员函数,可以给用户直接访问。要屏蔽用户的访问权限,可以在类中定义一个匿名函数,传给类中的一个引用变量,在类中其他子程序可通过这个函数引用调此函数,这样,对于外部使用用户来说,此函数是透明的,对于类里面来说,这个函数可以被类中的其他函数所访问。例子如下:

my $ref_hello = sub {
     print "hello world!/n";
};

此时,类中的其他方法可通过解引用访问私有成员函数:&$ref_hello();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值