面向对象中有三大特性:封装、继承、多态。相对于封装和继承,多态要相对复杂一些。
多态:相同的操作或函数、过程可以作用于多种类型的对象,并获取不同的结果。也就是说不同的对象,收到相同的消息后能产生不同的结果。
亦可以理解为:多种现状(状态),即一个对外的接口,有多个内部实现的方法,从而得到不同的结果。
比如电商网站中的推荐,男性、女性用户进入首页后,会有不同的商品展示出来,这也是一种多态的表现。
实例
最近一个项目中(优喔app,现在可能已经挂掉了),女主播打开世界动态,顶部消息栏有个推送:app监听socket的msgShow方法,将会获取不同的消息推送(男用户登录,用户充值,用户打赏礼物等),内部实现包括socket、http等请求调用相同的接口,方法。
- 我们再举一个简单的例子
场景描述:定义员工的工作状
// 定义员工父类
class employee{
// 定义员工工作,需要在子类中实现
protected function working(){
echo "本方法需要在子类中重载";
}
子类继承父类
//定义油漆工类
class painter extends employee{
//实现继承的工作方法
public function working(){
echo "油漆工正在刷漆!n";
}
}
// 定义打字员类
class typist extends employee{
//实现继承的工作方法
public function working(){
echo "打字员正在打字!n";
}
}
// 定义经理类
class manager extends employee{
//实现继承的工作方法
public function working(){
echo "经理正在开会!";
}
}
// 定义处理方法
function printworking($obj){
//若是员工对象,则显示其工作状态
if($obj instanceof employee){
$obj->working();
} else{ //否则显示错误信息
echo "Error: 对象错误!";
}
}
printworking(new painter()); //显示油漆工的工作
printworking(new typist()); //显示打字员的工作
printworking(new manager()); //显示经理的工作
分析:在上述程序中,首先定义一个员工基类,并定义一个员工工作状态的方法。然后定义将继承自员工基类的三个员工类:油漆工类、打字员类和经理类。然后定义显示员工工作状态的方法。并在该方法中创建一个“是否”关系,用于判断是否为合法的员工。其结果如下所示。
油漆工正在刷漆!
打字员正在打字!
经理正在开会!
从上例可发现,无论增加多少个员工类,只需要实现自员工父类继承的该员工类和方法。而无须修改显示员工工作状态的方法printworking()