分享到:

在网站制作中各种语言中的多态

日期:2016-10-25 21:06:00     阅读:495     文章来源:源美网络     标签:深圳网站建设,PHP语言

深圳网站建设中,我们经常会遇到网站程序各种语言的多态,下面就介绍几点:

多态确切的含义是:同一类的对象收到相同消息时,会得到不同的结果。而这个消息是不可预测的。多态,顾名思义,就是多种状态,也就是多种结果。

以Java为例,由于Java是强类型语言,因此变量和函数返回值是有状态的。比如,实现一个add函数的功能,其参数可能是两个int型整数,也可能是两个float型浮点数,而返回值可能是整型或者浮点型。在这种情况下,add函数是有状态的,它有多种可能的运行结果。在实际使用时,编译器会自动匹配适合的那个函数。这属于函数重载的概念。需要说明的是,重载并不是面向对象里的东西,和多态也不是一个概念,它属于多态的一种表现形式。

多态性是一种通过多种状态或阶段描述相同对象的编程方式。它的真正意义在于:实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属于的具体类。

很多地方会看到“PHP没有多态”这种说法。事实上,不是它没有,而是它本来就是多态的。PHP作为一门脚本语言,自身就是多态的,所以在语言这个级别上,不谈PHP的多态。在PHP官方手册也找不到对多态的详细描述。

既然说PHP没有多态这个概念(实际上是不需要多态这个概念),那为

什么又要讲多态呢?可以看下面的例子,如下所示:

<?php

class employee{

protected function working(){

echo'本方法需重载才能运行';

}

}

class teacher extends employee{

public function working(){

echo'教书';

}

}

class coder extends employee{

public function working(){

echo'敲代码';

}

}

function doprint($obj){

if(get_class($obj)=='employee'){

echo'Error';

}else{

$obj->working();

}

}

doprint(new teacher());

doprint(new coder());

doprint(new employee()); 

通过判断传入的对象所属的类不同来调用其同名方法,得出不同结果,这是多态吗?如果站在C++角度,这不是多态,这只是不同类对象的不同表现而已。C++里的多态指运行时对象的具体化,指同一类对象调用相同的方法而返回不同的结果。看个C++的例子,如下所示:

#include<cstdlib>

#include<iostream>

/**

C++中用虚函数实现多态

*/

using namespace std;

class father{

public:

father():age(30){cout<<"父类构造法,年龄"<<age<<"\n";}

~father(){cout<<"父类析构"<<"\n";}

void eat(){cout<<"父类吃饭吃三斤"<<"\n";}

virtual void run(){cout<<"父类跑10000米"<<"\n";}//虚函数

protected:

int age;

};

class son:public father{

public:

son(){cout<<"子类构造法"<<"\n";}

~son(){cout<<"子类析构"<<"\n";}

void eat(){cout<<"儿子吃饭吃一斤"<<"\n";}

void run(){cout<<"儿子跑100米"<<"\n";}

void cry(){cout<<"哭泣"<<"\n";}

};

int main(int argc,char*argv[])

{

father*pf=new son;

pf->eat();

pf->run();

delete pf;

system("PAUSE");

return EXIT_SUCCESS;

上面的代码首先定义一个父类,然后定义一个子类,这个子类继承父类的一些方法并且有自己的方法。通过father*pf=new son;语句创建一个派生类(子类)对象,并且把该派生类对象赋给基类(父类)指针,然后用该指针访问父类中的eat和run方法。下图所示是运行结果。

blob.png

由于父类中的run方法加了virtual关键字,表示该函数有多种形态,可能被多个对象所拥有。也就是说,多个对象在调用同一名字的函数时会产生不同的效果。

这个例子和PHP的例子有什么不同呢?C++的这个例子所创建的对象是一个指向父类的子对象,还可以创建更多派生类对象,然后上转型为父类对象。这些对象,都是同一类对象,但是在运行时,却都能调用到派生类同名函数。而PHP中的例子则是不同类的对象调用。

由于PHP是弱类型的,并且也没有对象转型机制,所以不能像C++或者Java那样实现father$pf=new son;把派生类对象赋给基类对象,然后在调用函数时动态改变其指向。在PHP的例子中,对象都是确定的,是不同类的对象。所以,从这个角度讲,这还不是真正的多态。

通过判断对象的类属性实现“多态”,此外,还可以通过接口实现多态,如下所示:

<?php

interface employee{

public function working();

}

class teacher implements employee{

public function working(){

echo'教书';

}

}

class coder implements employee{

public function working(){

echo'敲代码';

}

}

function doprint(employee$i){

$i$i->working();

}

$a=new teacher;

$b=new coder;

doprint($a);

doprint($b); 

这是多态吗?这段代码和代码清单1-8相比没有多少区别,不过这段代码中doprint函数的参数是一个接口类型的变量,符合“同一类型,不同结果”这一条件,具有多态性的一般特征。因此,这是多态。

如果把代码清单1-8中doprint函数的obj参数看做一种类型(把所有弱类型看做一种类型),那就可以认为代码清单1-8中的代码也是一种多态。

再次把三段代码放在一起品味,可以看出:区别是否是多态的关键在于看对象是否属于同一类型。如果把它们看做同一种类型,调用相同的函数,返回了不同的结果,那么它就是多态;否则,不能称其为多态。由此可见,弱类型的PHP里多态和传统强类型语言里的多态在实现和概念上是有一些区别的,而且弱类型语言实现起多态来会更简单,更灵活。

本节解决了什么是多态,什么不是多态的问题。至于多态是怎么实现的,各种语言的策略是不一样的。但是,最终的实现无非就是查表和判断。总结如下:

多态指同一类对象在运行时的具体化。

PHP语言是弱类型的,实现多态更简单、更灵活。

类型转换不是多态。

PHP中父类和子类看做“继父”和“继子”关系,它们存在继承关系,但不存在血缘关系。因此子类无法向上转型为父类,从而失去多态最典型的特征。

多态的本质就是if…else,只不过实现的层级不同。



文章引用:http://www.szymweb.com/new/141.html

本站文章为深圳网站建设·源美网络原创策划,如有版权纠纷或者违规问题,请联系我们删除,谢谢!

上一篇: 对PHP接口的思考

下一篇: 魔术方法的应用

返回列表
最新案例
OUR ADVANTAGE WORKS

售后保障

承诺任何问题1小时内解决

数据备份

更安全、更高效、更稳定

价格公道精准

项目经理精准报价不弄虚作假

合作无风险

重合同讲信誉,无效全额退款