Perl OOP

简介: <div class="markdown_views"><h2 id="1-模块类包">1. 模块/类(包)</h2><p>创建一个名为Apple.pm的包文件(扩展名pm是包的缺省扩展名,意为Perl Module)。 <br>一个模块就是一个类(包)。</p><h2 id="2-new方法">2. new方法</h2><p>new()方法是创建对象时必须

1. 模块/类(包)

创建一个名为Apple.pm的包文件(扩展名pm是包的缺省扩展名,意为Perl Module)。
一个模块就是一个类(包)。

2. new方法

new()方法是创建对象时必须被调用的,它是对象的构造函数。

sub new
{
    my $class = shift;
    my $this = {};
    bless $this, $class;
    return $this;
}

this={}/this。
bless()函数将类名与引用相关联。从new()函数返回后,$this引用被销毁。

3. bless方法

构造函数是类的子程序,它返回与类名相关的一个引用。
bless()函数将类名与引用相关联。
其语法为:bless reference [,class]
reference: 对象的引用
class: 是可选项,指定对象获取方法的包名,缺省值为当前包名。

4. 类方法

有两种方法:静态方法(如:构造函数)和虚方法。
静态方法第一个参数为类名,虚方法第一个参数为对象的引用。
虚方法通常首先把第一个参数shift到变量self或this中,然后将该值作普通的引用使用。
静态方法直接使用类名来调用,虚方法通过该对象的引用来调用。

5. 继承

@ISA数组含有类(包)名,@INC数组含有文件路径。
当一个方法在当前包中未找到时,就到@ISA中去寻找。
@ISA中还含有当前类继承的基类。

类中调用的所有方法必须属于同一个类或@ISA数组定义的基类。
@ISA中的每个元素都是一个其它类(包)的名字。
当类找不到方法时,它会从 @ISA 数组中依次寻找(深度优先)。
类通过访问@ISA来知道哪些类是它的基类。
e.g.

use Fruit;
our @ISA = qw(Fruit);

6. OOP Sample

Super Class: Fruit.pm

#!/usr/bin/perl -w

use strict;
use English;
use warnings;

package Fruit;

sub prompt
{
    print "\nFruit is good for health\n";
}

1;

Sub Class: Apple.pm
Note: Sub class Apple.pm extends super class Fruit.pm via putting Fruit into array @ISA in Apple.pm

#!/usr/bin/perl -w

use strict;
use English;
use warnings;

package Apple;

use Fruit;
our @ISA = qw(Fruit);

sub new
{
    my $class = shift;
    my %parm = @_;

    my $this = {};

    $this -> {'name'} = $parm{'name'};
    $this -> {'weight'} = $parm{'weight'};

    bless $this, $class;

    $this -> init();

    return $this;
}

sub init
{
    my $reference = shift;
    my $class = ref $reference;

    print "class: $class\n";

    while (my ($key, $value) = each (%$reference))
    {
        print "$key = $value\n";
    }
}

sub order
{
    my $class = ref shift;
    my $customer = shift;
    my $address = shift;
    my $count = shift;

    print "\n$customer order $count $class to $address\n";
}

1;

Main Class: Purchase.pl

#!/usr/bin/perl -w

use strict;
use English;
use warnings;

use Apple;

my $apple = new Apple('name' => 'Red Fuji', 'weight' => 300);

$apple -> prompt();

$apple -> order('Zhou Shengshuai', 'ChengDu', 99);

Output:

class: Apple
weight = 300
name = Red Fuji

Fruit is good for health

Zhou Shengshuai order 99 Apple to ChengDu
相关文章
|
27天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 5
Perl的面向对象编程涉及匿名哈希表或数组来存储对象属性。类通过`@ISA`数组实现继承,如Employee继承Person。在Employee.pm中声明`@ISA = qw(Person)`。在main.pl中,创建Employee对象并调用方法,显示继承功能。程序输出显示姓名的变化。
20 0
|
5月前
|
程序员 Python
Python的面向对象编程(OOP)详解
面向对象编程(OOP)是一种编程范式,它使用对象和类的概念,将数据和操作数据的方法封装在一起。Python是一门支持面向对象编程的强大语言,本文将深入探讨Python中的面向对象编程,包括类、对象、继承、多态等核心概念。
|
17天前
|
程序员 Python
面向对象编程(OOP)在Python中的应用
【4月更文挑战第8天】面向对象编程(OOP)是使用对象设计软件的编程范式,Python支持OOP,提供类、对象、继承和多态等概念。类是创建对象的蓝图,包含属性和方法。通过`class`关键字定义类,如`Person`类,然后通过类创建对象。继承使子类继承父类属性和方法,如`Student`继承`Person`。多态允许不同类的对象通过相同接口操作,如`print_greeting`函数调用不同对象的`greet`方法。掌握这些概念能编写高效、可维护的Python代码。
|
26天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 8
Perl面向对象教程展示了两种实现:通过匿名哈希表或数组存储对象属性。示例中,`MyClass`与子类`MySubClass`被定义,后者继承并扩展了父类方法。在主程序中,创建并调用了对象,演示了构造、方法调用、继承及自动调用析构函数的过程。
17 1
|
26天前
|
存储 Java 索引
Perl 教程 之 Perl 面向对象 7
在Perl OOP中,对象基于匿名哈希或数组实现,存储实例属性。当调用不存在的方法时,Perl查找AUTOLOAD来动态处理。析构函数DESTROY在对象销毁时自动调用,允许执行清理操作。不能修改传递给DESTROY的只读引用,但可写入对象本身。析构器可调用基类或其他类的DESTROY,但通常不手动调用。对象释放时,其所含对象也会自动销毁。
9 1
|
27天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 6
Perl 面向对象编程有两种实现:匿名哈希表和数组方式。教程中展示了基于哈希表的继承示例,Employee 类继承并重写了 Person 类的方法。在Employee中,`new`构造函数被重写,添加了新属性,`getFirstName`被重写,还新增了`setLastName`和`getLastName`方法。在主程序中,创建Employee对象并调用这些方法,显示了方法重写和辅助函数的使用效果。
20 3
|
27天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 4
Perl的面向对象涉及两种对象实现:匿名哈希表和数组。对象是类的实例,类是包含方法的Perl包。方法是接收对象引用作为首参的子程序。`bless()`函数用于构造对象。以下是一个Person类的例子,包含`new`构造器、`getFirstName`和`setFirstName`方法。在`employee.pl`脚本中,创建Person对象并演示了方法的使用。输出显示了姓名的设置和获取过程。
15 2
|
28天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 1
Perl的面向对象编程涉及两种实现:使用匿名哈希表存储对象属性的引用,或使用数组为每个属性创建行索引。对象是类的实例,类是包含方法的Perl包。方法是接受对象或类名作为首参的子程序。`bless()`函数用于构建对象,将引用与类关联。
13 3
|
28天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 2
Perl的面向对象编程涉及两种实现:匿名哈希表引用和数组引用。对象是类数据的引用,类是包含方法的Perl包。方法是接收类名作为首参的子程序。`bless()`函数用于构造对象。类定义为包,提供独立命名空间,文件通常以`.pm`结尾。例如: ```markdown .package Person # 类代码... .end ``` 简而言之,Perl的OOP基于引用,类是包,方法是子程序,`bless`构造对象,类定义创建命名空间。
15 2
|
28天前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 3
Perl的面向对象编程涉及两种实现:匿名哈希表引用和数组引用。对象是类(Perl包)中数据项的引用,方法是接收类名或对象作首参的子程序。
13 3