从字面来解释,多态就是事物的多种表现形式;从面向对象角度来解释的话,多态就是不一样对象中同种行为的不一样实现方式。举个例子:好比人吃饭,不一样的人吃饭方式都是不一样的,好比你多是委婉型的,小口小口慢慢地吃,我是大口大口豪放型的吃。这就是吃饭这个行为的不一样表现形式,统称「多态」。php
编程中多态是很常见的,咱们在不一样的抽象(类)中用相同的方法名来命名同种行为,而后再实现不一样的操做,这样作的优势是html
易扩展;git
调用方便;程序员
但不少人会搞不清楚多态的概念,就会形成不一样行为的操做也使用多态来实现。编程
概念易混淆;this
乱用多态来实现不一样的行为;code
下面咱们就用PHP代码来实现多态,例子:程序员在敲代码,球员在打球。htm
不用多态对象
<?php class Coder { public function playCode() { print_r("程序员在敲代码!<br/>"); } } class Player { public function playBall() { print_r("球员在打球!<br/>"); } } $coder = new Coder(); $player = new Player(); $coder->playCode(); $player->playBall();
上面的代码能够看出两种职业人在工做,这是相同的行为,不一样的内部操做,可以使用多态来实现:继承
<?php abstract class Professional { abstract public function play(); } class Coder extends Professional { public function play() { print_r("程序员在敲代码!<br/>"); } } class Player extends Professional { public function play() { print_r("球员在打球!<br/>"); } } class Run { private $profess; public function __construct($profess) { $this->profess = $profess; } public function play() { if ($this->profess instanceof Professional) { $this->profess->play(); } } } $coder = new Run(new Coder); $coder->play(); $player = new Run(new Player); $player->play();
上面的代码就是多态实现,是否是有点像策略模式;这样的好处就是再有这样的职业人添加进来只须要继承职业人类就能够实现相关的行为,那什么状况不能使用多态呢?
不一样行为不可以使用多态
好比程序员在吃饭、球员在玩游戏,这两种行为抽象不出来他们的相同点,不能勉强进行多态化
总结
不要为了多态而多态
原文连接:浅谈面向对象——多态