本文目标:

1、了解多态的定义

2、了解多态的作用

3、了解多态的使用场景

4、掌握多态的具体实现

还是按照之前一贯的思路,我们通过3W1H的方式进行学习,那么首先我们来了解一下

(一)、了解多态的定义

因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多样的,这种特性我们称作“多态

-比如接口A有2个实现B和C,B和C对A里面定义的方法可以是不同的,这种现象就是多态

(二)、了解多态的作用

作用就是可以让一个接口可以有不同的实现,这样使得代码更加贴合于真实世界,这样的方式拉近了代码和真实世界的距离,从而让开发者们能更加方便地去实现实现中的一些复杂的业务逻辑

(三)、了解多态的使用场景

其实这个使用场景,在我们一旦决定用接口的时候,这种现象就会出现,因为一旦一个接口有不同的实现类的时候,基本上这种现象就会发生,因为很多时候我们希望一个接口里面的某个或者多个方法,可以有不同的具体实现

-比如吃的方法,每个动物有每个动物的吃法,老鼠和猫都是直接吃,不会去考虑讲不讲究卫生,所以不会去把食物先洗一下再吃,但是人呢,是高级动物,所以都会讲究基本的卫生(神经病的除外),会去洗一下再吃,而且还会判断有些东西必须要煮熟了再吃,而且因为文化的差异,每个国家的人的吃法也不同,比如印度人直接用手吃,而中国人是用筷子吃,而西方有些国家则是用叉子,吃有不同的吃法,这在现实生活里是非常常见的,那还有很多事情也都是如此,所以多态的这种现象也是非常普遍,而我们写代码是使用面向对象编程的方式写,所以难免也会遇到“多态”,而且为了让我们的代码更加贴合真实世界,我们也必须使用“多态”

(四)、掌握多态的具体实现

总结:

1、多态的定义就是每个接口可以有多个不同的实现

每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观

(五)、具体代码

1、案例一

实践目标:

1、多态的定义就是每个接口可以有多个不同的实现

<?php//定义吃的接口interface Eat{    public function eat();}//定义猫的类class Cat implements Eat{    public function eat(){        echo "我是猫,抓到喜欢的老鼠,直接吃<br/>";    }}//定义人class Human implements Eat{    public function eat(){        echo "我是人,吃东西之前,都会洗一下再吃,因为我要讲究基本的卫生<br/>";    }}function Eat( $obj ){    if( $obj instanceof Eat ){        $obj->eat();    }else{        echo "该对象没有实现Eat的方法<br/>";    }}$cat = new Cat();$zs = new Human();//这行代码看出,一个吃的方法,传递不同的具体实现,结果就是可以有不同的实现,这就是多态Eat($cat);Eat($zs);?>

运行结果为:

我是猫,抓到喜欢的老鼠,直接吃
我是人,吃东西之前,都会洗一下再吃,因为我要讲究基本的卫生

(六)、学以致用

问题:用面向对象的编程方式模拟出以下真实的场景,代码要能体现出多态的概念

一个农村老人小刘,养了5鸡,和5只狗,每天早上,他都会6点准时起床,煮稀饭,吃完稀饭后,然后他会提着2小桶食物去给鸡和鸭喂食,走到鸡栏边,它把其中的一桶米倒入鸡食槽里,走到狗窝旁,又把剩下的装有残羹剩菜的一桶食物倒入狗狗吃的食槽里

思路分析:

1、对象分析:里面的对象有老人,鸡,狗,食物 所以至少有这4个类

2、对象属性分析:(结合具体的场景+现实世界)

老人:名称

鸡:个数

狗:个数

食物:名称

3、对象方法分析:(结合具体的场景+现实世界)

老人:起床,煮稀饭,吃(吃稀饭),喂食

鸡:吃(啄米吃)

狗:吃(吃骨头)

食物:设置食物名称

4、综上分析,我们发现其中3个对象都有吃的方法,但是他们分别有不同的吃法,所以我们可以把这个公共方法抽离出来做成一个接口,然后让这3个类分别去实现它

具体实现代码如下:

<?php//定义吃的接口interface Eat{    public function eat($food);}//定义食物class Food{    public $name = "";    public function __construct( $name ){        $this->name = $name;    }}//定义人class Human implements Eat{    public $name = "";    public function __construct( $name ){        $this->name = $name;    }    //起床    public function wakeup(){        echo $this->name."起床了<br/>";    }    //煮稀饭    public function cook($food){        echo $this->name."煮".$food->name."了<br/>";    }    public function eat($food){        echo $this->name."吃了".$food->name."<br/>";    }    //喂食    function startFeed( $obj,$food ){        if( $obj instanceof Eat ){            $obj->eat($food);        }else{            echo "该对象没有实现Eat的方法<br/>";        }    }    public function feed($obj, $food){        $this->startFeed( $obj,$food );    }}//定义鸡的类class Chiken implements Eat{    public $count = 5;    public function eat($food){        echo $this->count."只小鸡们,都吃了".$food->name."<br/>";    }}//定义狗的类class Dog implements Eat{    public $count = 5;    public function eat($food){        echo $this->count."只小狗们,都吃了".$food->name."<br/>";    }}//创建对象$xiaoliu = new Human("小刘");$chikens = new Chiken();$dogs = new Dog();//创建食物$xfFood = new Food("稀饭");$seedsFood = new Food("米");$mealFood = new Food("残羹剩饭");//老人起床$xiaoliu->wakeup();//老人煮稀饭$xiaoliu->cook($xfFood);//老人吃稀饭$xiaoliu->eat( $xfFood );//老人喂食开始$xiaoliu->feed($chikens,$seedsFood);//给小鸡喂食$xiaoliu->feed($dogs,$mealFood);//给小狗喂食?>

运行结果为:

小刘起床了
小刘煮稀饭了
小刘吃了稀饭
5只小鸡们,都吃了米
5只小狗们,都吃了残羹剩饭

(七)、总结

1、本文主要是讲了多态的定义和作用,以及具体的实现

希望本文能给大家带来一定的帮助,谢谢!!!

更多相关文章

  1. PHP自定义函数xmlToArray的实例解析
  2. PHP中数组规范和自定义集合
  3. PHP DIY系列之自定义配置和路由
  4. PHP预定义接口之Iterator用法示例
  5. 示例PHP购物车类Cart.class.php定义与用法
  6. PHP如何自定义的 printf 函数
  7. PHP自定义的 printf 函数新用途
  8. 5种PHP定义数组的方法
  9. Swoole自定义项目初始化事件处理的实现

随机推荐

  1. Android EditText 输入校验
  2. Android Maven Plugin
  3. android网络编程注意事项之一:移动网络下,
  4. Android静态,动态广播示例
  5. android中View.measure方法详解
  6. android apk 为程序增加代码混淆
  7. Android SDK下载和更新失败的解决方法
  8. Theme.Holo.Light详解
  9. Android梳理不常用widget篇
  10. Android build/envsetup.sh 脚本分析(lun