Perl 编程/对象
外观
< 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
- perlobj - Perl 对象引用,perldoc.perl.org
- Perl OOP,perltutorial.org