<pre name="code" class="html">12.5.3 UNIVERSAL:最终的祖先类:

你可以把 UNIVERSAL 看作最终的祖先,所 有类都隐含地从它衍生而来。

INVOCANT->isa(CLASS)

如果 INVOCANT 的类是 CLASS 或者任何从 CLASS 继承来的,isa 方法返回真。 除了包名字以外,CLASS还
可以是一个内建的类型,比如 "HASH" 或者 "ARRAY"。 (准确地检查某种类型在封装和多态性机制中并不能很好
地工作。你应该依赖重 载分检给你正确的方法。) [root@wx03 test]# cat t9.pl
unshift(@INC,"/root/test");
use Horse;;
if (Horse->isa("Critter")) {
print "true.\n";
}
[root@wx03 test]# perl t9.pl
true. [root@wx03 test]# cat t9.pl
unshift(@INC,"/root/test");
use Horse;;
if (Horse->isa("Horse")) {
print "true.\n";
} [root@wx03 test]# perl t9.pl
true. INVOCANT->isa(CLASS) 对应的if (Horse->isa("Horse")) 如果INVOCANT 的类是CLASS或者任何从CLASS继承来的,isa方法返回真。除了包名字以外,CLASS还可以是一个内建的类型 比如HASH 或者ARRAY [root@wx03 test]# cat t10.pl
unshift(@INC,"/root/test");
use Horse;;
if (Horse->isa("Critter")) {
print "true.\n";
}
[root@wx03 test]# perl t10.pl
true. 判断Horse类是否继承("Critter")) 类 isa(CLASS)
如果调用 "isa" 的对象是隶属于 "CLASS" 或者它的子类, 那么 "isa" 返回
*真值*。 你也可以用传递两个参数的办法直接调用 "UNIVERSAL::isa":第一个参数是
一个对象(甚至是普通的引用),这个办法可以用来检查一个对象是不是属于
指定的类型。例如:
if(UNIVERSAL::isa($ref, 'ARRAY')) {
#...
} [root@wx03 test]# cat Horse.pm
package Horse;
our @ISA = "Critter";
sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {
color => "bay",
legs => 4,
owner => undef,
@_, # 覆盖以前的属性
};
return bless $self, $class;
};
sub sum1 {
$self=shift;
my $a=shift;
my $b=shift;
return $a + $b + 7;
}; our @arr=qw/1 2 3 4 5 6 7/;
our %h1=(1,2,3,4,5,6,7,8);
1; unshift(@INC,"/root/test");
use Horse;;
$ua=Horse->new();
if (UNIVERSAL::isa($ua,'HASH')) {
print "true.\n"; [root@wx03 test]# perl t10.pl
true. 判断 $ua是不是HASH 判断一个引用是不是被bless过的: [root@wx03 test]# perl t10.pl
It's an object
[root@wx03 test]#
[root@wx03 test]#
[root@wx03 test]# cat t10.pl
unshift(@INC,"/root/test");
use Horse;;
$ua=Horse->new(); print "It's an object\n" if UNIVERSAL::isa($ua, 'UNIVERSAL'); [root@wx03 test]# perl t10.pl
It's an object 注释掉bless
[root@wx03 test]# cat Horse.pm
package Horse;
our @ISA = "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;
}; our @arr=qw/1 2 3 4 5 6 7/;
our %h1=(1,2,3,4,5,6,7,8);
1;
[root@wx03 test]# perl t10.pl
[root@wx03 test]# 没有返回 [root@wx03 test]# cat t10.pl
unshift(@INC,"/root/test");
use Horse;;
$ua=Horse->new(); #print "It's an object\n" if UNIVERSAL::isa($ua, 'UNIVERSAL');
$code=Horse->can(sum1); use Data::Dumper;
$str=Dumper($code);
print "\$str is $str\n"; [root@wx03 test]# perl t10.pl
$str is $VAR1 = sub { "DUMMY" }; 如果 INVOCANT 中有 METHOD,那么 can 方法就返回一个可以调用的该子过程的 引用。如果没有定义这样的
子过程,can 返回 undef。 12.5.3 UNIVERSAL:最终的祖先类: 在 UNIVERSAL 类里面有下面的预定义的方法可以使用,因此所有类中都可以用它们。而且 不管它们是被当作类
方法还是对象方法调用的都能运行。 INVOCANT->isa(CLASS) 如果 INVOCANT 的类是 CLASS 或者任何从 CLASS 继承来的,isa 方法返回真。 [root@wx03 test]# cat t12.pl
unshift(@INC,"/root/test");
use Horse;;
if (Horse->isa("Critter")) {
print "true.\n";
}
[root@wx03 test]# perl t12.pl
true. [root@wx03 test]# cat t12.pl
unshift(@INC,"/root/test");
use Horse;;
if (Horse->isa("Horse")) {
print "true.\n";
}
[root@wx03 test]# perl t12.pl
true. [root@wx03 test]# cat t12.pl
unshift(@INC,"/root/test");
use Horse;;
if (Horse->isa("Horse1")) {
print "true.\n";
}
[root@wx03 test]# perl t12.pl
[root@wx03 test]# [root@wx03 test]# cat t13.pl
unshift(@INC,"/root/test");
use Horse;;
$ua=Horse->new();
if (UNIVERSAL::isa($ua,'HASH')) {
print "true.\n";
};
[root@wx03 test]# perl t13.pl
true. 检测$ua是否是hash [root@wx03 test]# cat t13.pl
unshift(@INC,"/root/test");
use Horse;;
$ua=Horse->new();
if (Horse->can("sum1")) {
print "Our invocant can copy.\n";
}
[root@wx03 test]# perl t13.pl
Our invocant can copy. 如果 INVOCANT 中有 METHOD,那么 can 方法就返回一个可以调用的该子过程的 引用。如果没有定义这样的
子过程,can 返回 undef。
												

12.5.3 UNIVERSAL:最终的祖先类:的更多相关文章

  1. perl 祖先类UNIVERSAL

    在perl 面向对象编程里,同其它语言一样存在祖先类.所有类默认继承UNIVERSAL的属性和方法. UNIVERSAL​类有几个常用方法can,isa. can可以检查一个对象是否有相应的方法,这个 ...

  2. 访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)

    访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: t ...

  3. Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)

    前几天在CSDN社区看到一篇<如何得到自身单元名称>的帖子,其中一位名为sdzeng网友给出了答案.受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称. //参 ...

  4. firedac数据集控件的公共祖先类——TFDAdaptedDataSet

    firedac数据集控件的公共祖先类——TFDAdaptedDataSet TFDQuery = class(TFDCustomQuery)TFDCustomQuery = class(TFDRdbm ...

  5. 妙味css3课程---1-2、css3中新增的伪类和伪元素有哪些

    妙味css3课程---1-2.css3中新增的伪类和伪元素有哪些 一.总结 一句话总结: 1.div:target{}是什么意思? 比如a标签的锚点链接到div,div:target{}就可以找到这个 ...

  6. 浅谈java中的祖先类Object

    首先一道题: public class User{ private String name; private int age; public String getName() { return nam ...

  7. 2015/12/29 eclipse 设置要点 空间 项目 类 eclipse汉化

    开始使用eclipse,双击eclipse.exe文件,启动eclipse.程序会显示一个工作空间的对话框,工作空间用来存放你的项目文件,你可以使用程序默认的,点击确定即可,你也可以重新选择一个文件夹 ...

  8. android开发之路12(android四大组件&Fragment&AsyncTask类)

    一.Activity组件1.简介:Activity组件是Android四大组件之一,通常一个Activity相当于一个用户界面,我们可以通过加载布局文件将Android提供的各种控件及自定义控件显示到 ...

  9. python多继承中子类访问祖先类的同名成员

    子类调用父类的同名成员 方式1: class A: def f_a(self): print("----A----") class B: def f_a(self): print( ...

随机推荐

  1. WebHdfs

    https://github.com/ihrwein/webhdfs https://tiborbenke.blogs.balabit.com/2013/11/the-syslog-ng-in-the ...

  2. android中使用DisplayMetrics获取屏幕参数

    --关于Density int android.graphics.Bitmap.getDensity(),返回bitmap-density(密度).默认的density就是当前display-dens ...

  3. Java调用Python脚本

    今天遇到Java调用一个Python脚本的问题,纠结了大半天,遇到各种问题.网上搜索的大部分都是用jython,但是我想要调用的python脚本里有import urllib,这个urllib也不是什 ...

  4. Debian下Apache配置多域名访问

    请见Github博客:http://wuxichen.github.io/Myblog/php/2014/10/10/DebianApacheSetting.html

  5. Unity Notes调制粒子系统的颗粒的最大数目

    Unity该粒子系统是很容易使用.这样的问题是在实际的过程中遇到的:以控制的粒子系统组件的动态需要可产生颗粒的最大数目. 看doc他说,有maxParticles控制.却没有这个开放的參数.仅仅能通过 ...

  6. 怎样使用windows命令行,用notepad打开某文件夹下面的所有文件

    http://zhidao.baidu.com/question/2138815012359999388.html __________________________________________ ...

  7. python学习(一)

    1 python一切皆为对象,因为现实 包含了一系列的数据和操作这些数据的方法的一个整体,就叫作对象. 自行车 属性:手刹车,轮胎,脚踏板方法:如何前进的方法,控制停止的方法,控制方向 实际内容 男人 ...

  8. [Swust OJ 249]--凸包面积

        题目链接:    http://acm.swust.edu.cn/problem/0249/   麦兜是个淘气的孩子.一天,他在玩钢笔的时候把墨水洒在了白色的墙上.再过一会,麦兜妈就要回来了, ...

  9. windows和centos用cutycapt截网页的图

    centos下:(主要参考http://loosky.net/2816.html) (1)安装qt47 增加qt47的源 vim /etc/yum.repos.d/atrpms.repo //加入如下 ...

  10. JSON数组分配输出每个li

    有这么一个JSON数组,需求是只需要输出每个数组里面的某个值,不需要全部输出来. var data = [ { ", "Cost":"13,642.41&quo ...