第十二章 对象(上)

第十二章 对象(上)

对象是一个数据结构,带有一些行为。我们通常把这些行为成为对对象的直接动作,

有时候可以把这些对象拟人化。

作为一个类的实例,对象从中获益,取得起行为。类定义方法:就是那些应用于类和其它的事例的性质。

如果需要区分上面两种情况,那么我们就把适用于某一特定对象的方法叫做实例方法,


而把那些适用于整个类的方法叫做类方法。


12.2 Perl的对象系统:

Perl 没有为定义对象,类或者方法提供任何特殊的语法。相反,它使用现有的构造来实现这三种概念。

一个对象只不过是一个引用

zjzc01:/root/big2# cat a26.pl 
use Net::FTP;
$ftp = Net::FTP->new("192.168.32.101",Port=>1029, Debug => 0)    or die "Cannot connect to some.host.name: $@";
print $ftp;
print "
";

zjzc01:/root/big2# perl a26.pl 
Net::FTP=GLOB(0x12f75d8)


一个类只是一个包:

一个包当作一个类---通过使用包的子过程来执行类的方法,以及通过使用包的变量来保存类的全局数据。



通常,使用一个模块来保存一个或者更多个类。


一个方法只是一个子过程:




你只需要在你当作类作用的包中声明子过程,它们就会被当作该类的方法来使用。方法调用时调用子过程的一种新的方法,


它传递额外的参数:用于调用方法锁使用的对象或包。


方法是对象系统的核心,因为它们为实现所有魔术提供了抽象层。


你不是直接访问对象里的一块数据区,


Perl 支持调用方法的两种不同的语义。一种是你已经在Perl别的地方看惯了的风格,而第2种是你可以在其他编程语言中看到的。


不管使用哪种方法调用的形式,Perl总是会给构成这个方法的子过程传递一个热爱的初始化参数。




如果用一个类调用该方法,那个参数将会是类的名字。

如果用一个对象调用方法,那个参数就是对象的引用。


对于一个实例方法,调用者是一个声明对象的引用。


12.3.1 使用箭头操作符的方法调用:


我们说过有两种风格的方法调用。第一种调用方法的风格看起来像下面这样:


INVOCANT->METHOD(LIST)

INVOCANT->METHOD


而当INVOCANT 是一个包的名字的时候,我们把那个被调用的METHOD看作类的方法。


实际上两者之间并没有区别,只不过和类的对象相比,包名字与类本身有着更明显的关联。

比如,使用类方法 summon 的构造一个类,然后在生成的对象上调用实例方法 speak,
你可以这么说:
$mage = Wizard->summon("Gandalf"); # 类方法

$mage->speak("friend"); # 实例方法


12.3.2  使用间接对象的方法调用:

第二种风格的方法调用看起来象这样:
METHOD INVOCANT (LIST)

METHOD INVOCANT LIST

METHOD INVOCANT


12.3.4  引用包的类:

CONSTRUCTOR
       new ([ HOST ] [, OPTIONS ])
           This is the constructor for a new Net::FTP object. "HOST" is the name of the remote host to which an FTP connection is required.


这是一个构造器用于一个新的Net::FTP对象,"HOST"是你需要连接的机器。

12.4 构造对象:


所有对象都是引用,但不是所有引用都是对象。


一个引用不会作为对象运转,除非引用它的东西又特殊标记告诉Perl 它属于哪个包。


把一个引用和一个包名字标记起来(因此也和包中的类标记起来,因为一个类就是一个包)的动作被称为赐福(bless)

你可以把bless 看作把一个引用转换成一个对象,尽管更准确地说是它把该引用转换成一个对象引用

bless 函数接收一个或者两个参数,第一个参数是一个引用,而第二个是要把引用bless成的包,如果忽略第2个参数,则使用当前包

$obj = { }; # 把引用放到一个匿名散列
bless($obj); # Bless 散列到当前包
bless($obj, "Critter"); # Bless 散列到类 Critter。


12.4.2 初始器:


假设一个 Horse 类有一些实例属性,比如 "name" 和 "color":

$steed = Horse->new(name => "shadowfax", color => "white");


这回我们用一个名字叫 new 的方法做该类的构造

















原文地址:https://www.cnblogs.com/hzcya1995/p/13351116.html