Perl 的面向对象编程(OOP)功能虽然不如Java或C++那样原生,但通过其灵活的机制(如包和引用)实现了OOP的基本特性。本文将介绍Perl中类的定义、对象创建及继承等内容。


目录

  1. 面向对象概述
  2. 类的定义
  3. 对象创建与方法调用
  4. 构造与析构函数
  5. 继承
  6. 使用模块增强OOP
  7. 参考资料

1. 面向对象概述

Perl 的OOP基于以下机制:

  • 包(Package):作为类的命名空间。
  • 引用:对象通常是哈希引用。
  • 方法:子程序绑定到类。

Perl 支持封装、继承和多态,但没有严格的访问控制(如private/protected)。

站内链接:了解引用,见 Perl 引用


2. 类的定义

Perl 中类是一个包,对象是引用(通常是哈希)。

基本类

use strict;
use warnings;

package Person;

# 构造函数
sub new {
    my $class = shift;
    my $self = {
        name => shift || "Anonymous",
        age  => shift || 0,
    };
    return bless $self, $class;  # 将哈希绑定到类
}

# 方法
sub get_name {
    my $self = shift;
    return $self->{name};
}

sub set_name {
    my ($self, $name) = @_;
    $self->{name} = $name;
}

1;  # 包必须返回真值

3. 对象创建与方法调用

创建对象

use Person;

my $person = Person->new("Alice", 25);
print "姓名:", $person->get_name, "\n";  # 姓名:Alice

方法调用

  • 箭头操作符(->):调用实例方法。
  • 类方法:直接使用类名调用。
$person->set_name("Bob");
print "新姓名:", $person->get_name, "\n";  # 新姓名:Bob

4. 构造与析构函数

构造函数

new 是惯例名称,非强制:

package Car;

sub new {
    my ($class, $model) = @_;
    my $self = { model => $model };
    bless $self, $class;
    return $self;
}

sub get_model {
    my $self = shift;
    return $self->{model};
}

1;

使用:

my $car = Car->new("Tesla");
print "车型:", $car->get_model, "\n";  # 车型:Tesla

析构函数

DESTROY 在对象销毁时自动调用:

package Resource;

sub new {
    my $class = shift;
    my $self = { id => shift };
    bless $self, $class;
}

sub DESTROY {
    my $self = shift;
    print "资源 $self->{id} 已释放\n";
}

1;

测试:

{
    my $res = Resource->new(123);
}  # 离开作用域,输出:资源 123 已释放

5. 继承

Perl 使用 @ISA 数组实现继承。

单继承

package Employee;
use parent 'Person';  # 或 @ISA = ('Person');

sub new {
    my ($class, $name, $age, $job) = @_;
    my $self = $class->SUPER::new($name, $age);  # 调用父类构造函数
    $self->{job} = $job;
    return $self;
}

sub get_job {
    my $self = shift;
    return $self->{job};
}

1;

使用:

use Employee;

my $emp = Employee->new("Alice", 30, "Engineer");
print "姓名:", $emp->get_name, "\n";  # 姓名:Alice
print "工作:", $emp->get_job, "\n";   # 工作:Engineer

6. 使用模块增强OOP

Moose

现代Perl OOP框架,提供类声明和属性管理。

安装

cpan Moose

示例

use Moose;

package Student;
has 'name' => (is => 'rw', isa => 'Str');
has 'grade' => (is => 'rw', isa => 'Int');

sub study {
    my $self = shift;
    print "$self->name 在学习\n";
}

__PACKAGE__->meta->make_immutable;
no Moose;
1;

使用:

use Student;

my $stu = Student->new(name => "Bob", grade => 85);
$stu->study;  # Bob 在学习
print "成绩:", $stu->grade, "\n";  # 成绩:85

优点:类型检查、自动生成方法。


7. 参考资料

站内链接

出站链接

其他资源

  • 《Object-Oriented Perl》 – 面向对象书籍。
  • X社区:搜索 #PerlOOP 获取示例。

这篇指南详细介绍了Perl面向对象编程的基础和高级用法,从简单类定义到Moose框架一应俱全。如果需要更深入的内容(比如多重继承或封装实现),请告诉我!