首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Perl 面向对象编程的两种实现和比较(2)

Perl 面向对象编程的两种实现和比较(2)

基于匿名散列表的方法中的继承:Perl 允许一个模块在一个特殊的名为 @ISA 的数组中制定一组其他模块的名称。当在模块中找不到某个实例方法时,它就为检查那个模块的 @ISA 是否被初始化。如果已经初始化了,它就为检查其中的某个模块是否支持这个“缺少”的函数。如果它按照深度优先的层次结构搜索 @ISA 数组并且发现同名的方法,它会调用第一个被发现的同名方法并将控制权交给它。我们利用 Perl 语言的这个特性实现了继承。
考虑这样一个类的层次,我们定义一个 Employee 类,继承于基类 Person,如清单 5 所示。
我们将类名 Person 放入包 Employee 的 ISA 数组中,这样当调用一个在包 Employee 中没有定义的函数时,Perl 编译器会自动在 Person 类寻找这个函数。当用户调用 new 函数初始化一个 Employee 对象实例的时候,Employee 的 new 函数会在内部调用它的基类的 new 函数,并且返回一个包含部分以初始化的基类实例属性的匿名哈希表。接着 Employee 的 new 函数将继续执行 new 函数的剩余代码,完成属于 Employee 自身的初始化工作,为 Employee 中剩余的实例属性赋值。
清单 5. 基于匿名哈希表的面向对象编程中的继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use Person;

package Employee;
@ISA = qw (Person);

sub new {
shift;
my ($name, $age, $salary) = @_;
my $self = Person->new ($name, $age);
$self->{salary} = $salary;
bless ($self);
return $self;
}

sub change_salary {
my $self = shift;
my $new_salary = shift;
$self->{salary} = $new_salary;
}

my $object_employee = Employee->new ( "Tonny", 28, 10000 );
print "Name : " . $object_employee->{name} . ", Age : " . $object_employee->{age} .
", Salary : " . $object_employee->{salary} . ". \n";
$object_employee->change_name ("Tommy");
$object_employee->change_salary (13000);

print "Name : " . $object_employee->{name} . ", Age : " . $object_employee->{age} .
", Salary : " . $object_employee->{salary} . ". \n";




当用户调用 Employee 的 change_name 方法和 change_salary 方法时,Perl 解析器会在 Employee 包和 Person 包中搜索,寻找符合的函数供期调用。
返回列表