对象(下):

原创 2016年05月31日 14:51:59
对象(下):

如果 @ISA 包含多于一个包的名字,包的搜索都是从左向右的顺序进行的。这些搜索是由
浅入深的,因此,如果你有一个 Mule 类有象下面这样的继承关系:


因为一个 BEGIN 块立即就执行了,所以它甚至可以在其他文件编译前把子过程声明, 定义以及输入等抓过来。这
些动作可能改变编译器对当前文件其他部分分析的结果, 特别是在你输入了子过程定义的情况下。至少,声明一个
子过程就把它当作一个列表 操作符使用,这样就令圆括号是可选的。如果输入的子过程定义了原型,那么调用它
的时候就会当作内建函数分析,甚至覆盖同名的内建函数,这样就可以给它们不同的 语意。use 声明就是一个带有
目的的 BEGIN 块声明。

访问被覆盖的方法:

[root@wx03 5]# cat a5.pl 
END {print cccccccccccc."\n"};
print "aaaaaaaaaaaaa\n";
BEGIN {print bbbbbbbbbbbbbb."\n"};

[root@wx03 5]# perl a5.pl 
bbbbbbbbbbbbbb
aaaaaaaaaaaaa
cccccccccccc

根据结果,我们得出,BEGIN是在Perl语言运行最开始运行的块,END是在Perl语言运行最后运行的块,并注意BEGIN和END必须是大写的。



有时候, 你希望一个衍生类的方法表现得象基类中的某些方法的封装器。

这就是 SUPER 伪类提供便利的地方。它令你能够调用一个覆盖了的基类方法,而不用声
明是哪个类定义了该方法。


访问被覆盖的方法:


[root@wx03 5]# cat Critter.pm 
package Critter;  
sub new {  
    my $self = {};  
    my $invocant = shift;      
my $class = ref($invocant) || $invocant;  
    my ($name)=@_;      
      my $self = {      
         "name" =>$name      
                 };    
    bless $self, $class; # Use class name to bless() reference  
    return $self;  
  
};  
  
sub sum2 {  
       $self=shift;  
       my $a=shift;  
       my $b=shift;  
       return $a + $b;  
};  
  
  
sub fun1 {  
       $self=shift;  
       my $a=shift;  
       my $b=shift;  
       return $a / $b;  
}  

sub kick {
      my  $self=shift;
       my $a=shift;
       my $b=shift;
       return $a / $b +66;
}

1;  
[root@wx03 5]# cat a6.pl 
use Horse;
use Data::Dumper;

$steed = Horse->new(color => "dun");
print $steed->kick(33,4);
print "\n";
use base qw(Critter);  
require Critter;
print $steed->SUPER::kick(33,4);
print "\n";
[root@wx03 5]# perl a6.pl 
132
74.25

/********************

[root@wx03 5]# cat Horse.pm 
package Horse;  
our @ISA = "Critter";  
require Critter;  
sub new {  
my $invocant = shift;  
my $class = ref($invocant) || $invocant;  
my $self = {  
color => "bay",  
legs => 4,  
owner => undef,  
@_, # 覆盖以前的属性  
};  
return bless $self, $class;  
#return  $self;  
};  
sub sum1 {  
       $self=shift;  
       my $a=shift;  
       my $b=shift;  
       return $a + $b + 7;  
}; 

sub kick {
  my $self=shift;
  $self->SUPER::kick(@_);
};
1;


[root@wx03 5]# cat Critter.pm 
package Critter;  
sub new {  
    my $self = {};  
    my $invocant = shift;      
my $class = ref($invocant) || $invocant;  
    my ($name)=@_;      
      my $self = {      
         "name" =>$name      
                 };    
    bless $self, $class; # Use class name to bless() reference  
    return $self;  
  
};  
  
sub sum2 {  
       $self=shift;  
       my $a=shift;  
       my $b=shift;  
       return $a + $b;  
};  
  
  
sub fun1 {  
       $self=shift;  
       my $a=shift;  
       my $b=shift;  
       return $a / $b;  
}  

sub kick {
      my  $self=shift;
       my $a=shift;
       my $b=shift;
       return $a / $b +66;
}

1;  
[root@wx03 5]# cat a6.pl 
use Horse;
use Data::Dumper;

$steed = Horse->new(color => "dun");
print $steed->kick(12,4);
print "\n";
[root@wx03 5]# perl a6.pl 
69


UNIVERSAL :最终的祖先类:

这个包从来不会在
@ISA 中出现,但如果查找 @ISA 失败总是要查找它。你可以把 UNIVERSAL 看作最终
的祖先,所有类都隐含地从它衍生而来。



INVOCANT->isa(CLASS)
如果 INVOCANT 的类是 CLASS 或者任何从 CLASS 继承来的,isa 方法返回真。


[root@wx03 5]# cat a7.pl 
use Horse;
use Data::Dumper;

$steed = Horse->new(color => "dun");
print $steed->isa(Horse);
print "\n";
print $steed->isa(Critter);
print "\n";
print $steed->isa(test);
print "\n";
[root@wx03 5]# perl a7.pl 
1
1

[root@wx03 5]# 

$steed的类是Horse 或者从Horse继承而来的((Critter);


判断是否是HASH类型:
[root@wx03 5]# cat a7.pl 
use Horse;
use Data::Dumper;

$steed = Horse->new(color => "dun");
print $steed->isa(Horse);
print "\n";
print $steed->isa(Critter);
print "\n";
print UNIVERSAL::isa($steed,'HASH');
print "\n";
[root@wx03 5]# perl a7.pl 
1
1
1


判断方法是否存在:
[root@wx03 5]# cat a8.pl 
use Horse;
use Data::Dumper;

$steed = Horse->new(color => "dun");
print $steed->can(sum1);
print "\n";
print $steed->can(sumxx);
print "\n";
[root@wx03 5]# perl a8.pl 
CODE(0x28f89d0)

[root@wx03 5]# 

我们可以用这个方法实现条件调用——只有方法存在才调用:
$obj->snarl if $obj->can("snarl");


方法自动装载:

[root@wx03 5]# cat Horse.pm 
package Horse;  
our @ISA = "Critter";  
require Critter;  
sub new {  
my $invocant = shift;  
my $class = ref($invocant) || $invocant;  
my $self = {  
color => "bay",  
legs => 4,  
owner => undef,  
@_, # 覆盖以前的属性  
};  
return bless $self, $class;  
#return  $self;  
};  
sub sum1 {  
       $self=shift;  
       my $a=shift;  
       my $b=shift;  
       return $a + $b + 7;  
}; 

sub kick {
  my $self=shift;
  $self->SUPER::kick(@_);
};

%h1=(a=>1);
sub AUTOLOAD {
return testdadadak888  ;
};
1;
[root@wx03 5]# cat a8.pl 
use Horse;
use Data::Dumper;

$steed = Horse->new(color => "dun");
print $steed->dahda8da;
print "\n";
[root@wx03 5]# perl a8.pl 
testdadadak888
[root@wx03 5]# 


私有方法:

实例析构器;

管理实例数据:

比如,如果你希望一个叫 $city 的对象有一个数据
域名字叫 elevation,你可以简单地 $city->{elevation} 这样访问它。可以不用声明。
方法的封装会为你做这些。


大多数类都把它们的对象的属性保存在一个匿名散列表
里。对象的实例数据保存在这个散列表里,这个散列表也是该对象自己的小名字空间,用以
划分哪个类对该对象进行了哪些操作。

use fields  定义的域:

对象不一定要用匿名散列来实现。任何引用都可以。比如,如果你使用一个匿名数组,你可
以这样设置一个构造器;

用 Class::Struct  生成类:

使用 Autoloading (自动装载)生成指示器:


对象转型(向上转型和向下转型)

一、对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型。转型的意思是:如把float类型转成int类型,把doub...
  • qq_24892029
  • qq_24892029
  • 2016年05月09日 17:04
  • 1047

js对象的三种继承方式

一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 复制代码 代码如下:           function Person(name,a...
  • ojayxin
  • ojayxin
  • 2017年06月23日 15:07
  • 340

Oracle中删除用户下所有对象的多种方法

Oracle中删除用户下所有对象的多种方法 Oracle删除用户下所有对象的方法未必人人都会,下面就为您介绍两种常用的Oracle删除用户下所有对象的方法,希望对您学习Oracle删除用户方面...
  • haiross
  • haiross
  • 2015年09月22日 13:12
  • 21750

JS Windows对象下一些常用对象和方法属性

html> html lang="en"> head> meta charset="UTF-8"> title>title> head> body> body> script> ...
  • LEI2879223426
  • LEI2879223426
  • 2017年06月24日 17:07
  • 219

ORACLE删除某用户下所有对象

--.sql脚本 --唯一注意的是下面的f:\dropobj.sql 为操作的.sql; --你的电脑没有F盘,请换为D或者E其他存在的盘符 --用于删除当前用户的所有对象 --use for dro...
  • xiaol_zhong
  • xiaol_zhong
  • 2013年10月26日 15:50
  • 5473

ARC 下两种释放对象的方法

使用了 ARC 之后,无疑大大减少了程序员进行内存管理的压力。你再也不用写 release/autorelease 代码了,再也不用写dealloc 方法了。但这不等于程序员不需要内存管理。例如,你需...
  • kmyhy
  • kmyhy
  • 2013年10月04日 12:32
  • 13735

ARC下属性对象实例对象内存释放时机

ARC下属性对象实例对象内存释放时机      在ARC的机制里,内存是由系统释放,ARC的一个基本规则即使,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何stron...
  • shenyingqiang
  • shenyingqiang
  • 2015年11月01日 00:53
  • 1653

XMLHttpRequest对象的创建

首先了解XMLHttpRequest对象的基本运用    XMLHttpRequest对象用于和服务器交互数据  如需将请求发送到服务器,我们使用XMLHttprequest对象的Open()和sen...
  • han_yankun2009
  • han_yankun2009
  • 2014年01月03日 14:03
  • 2290

Oracle 中如何删除一个用户拥有的所有对象

下面的脚本在oracle中如何将一个用户所拥有的所有对象,表,sequence,procedure。。。全部删掉。 1,drop 对象的方式,注意要先将所有的外键约束删掉。 DECLARETYPE c...
  • kkdelta
  • kkdelta
  • 2009年07月24日 16:07
  • 4677

状态模式:分离对象的状态到各个独立类中,以避免一个方法体包含过多的判断

1.状态类 namespace StatePattern {     /*状态模式:一个方法的判断逻辑太长,就不容易修改。方法过长,其本质就是,      * 就是本类在不同条件下的状态转移。...
  • yoyoshaoye
  • yoyoshaoye
  • 2012年01月12日 20:45
  • 1217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象(下):
举报原因:
原因补充:

(最多只允许输入30个字)