跳转到内容

Perl 编程/对象

来自维基教科书,开放的书籍,为开放的世界
上一页:代码重用(模块) 索引 下一页:结构和风格

在 Perl 最初开发时,完全不支持面向对象(OO)编程。从 Perl 5 开始,使用 Perl 包(命名空间)的概念,一个名为bless的操作符,一些魔法变量(@ISA, AUTOLOAD, UNIVERSAL),->和一些支持继承和封装的强大约定,添加了 OO 功能。

使用package关键字创建对象。在该包中声明的所有子程序都成为对象或类方法。

类实例是通过调用构造函数方法创建的,该构造函数方法必须由类提供,按照惯例,此方法称为new()

让我们看看这个构造函数。

package Object;

sub new {
  return bless {}, shift;
}

sub setA {
  my $self = shift;
  my $a = shift;
  $self->{a}=$a;
}

sub getA {
  my $self = shift;
  return $self->{a};
}

客户端代码可以使用这个类,如下所示。

my $o = Object->new;
$o->setA(10);
print $o->getA;

这段代码打印 10。

让我们更详细地看一下new构造函数

首先,当使用->符号调用子程序时,一个新参数会被预先添加到参数列表中。它是一个字符串,包含包名或对象引用(Object->new()$o->setA。在弄懂这一点之前,你会发现 Perl 中的 OO 非常令人困惑。

为了在对象中使用私有变量并进行变量名检查,你可以使用一种略微不同的方法来创建对象。

package my_class;
use strict;
use warnings;
{
  # All code is enclosed in block context

  my %bar;  # All vars are declared as hashes
  sub new {
    my $class = shift;
    my $this = \do{ my $scalar }; # object is a reference to scalar (inside out object)
    bless $this, $class;
    return $this;
  }

  sub set_bar {
    my $this = shift;
    $bar{$this} = shift;
  }

  sub get_bar {
    my $this = shift;
    return $bar{$this};
  }
}

现在你有了很好的封装 - 你不能直接通过$o->{bar}访问对象变量,只能使用 set/get 方法。也不可能在对象变量名中犯错误,因为它们不是哈希键,而是需要声明的普通 Perl 变量。

我们以与哈希祝福对象相同的方式使用它们

my $o = my_class->new();
$o->set_bar(10);
print $o->get_bar();

打印10

进一步阅读

[编辑 | 编辑源代码]


上一页:代码重用(模块) 索引 下一页:结构和风格
华夏公益教科书