分析下面代码:
<?php
/**
* Created by PhpStorm.
* User: ZhouTengFu
* Date: 2018/2/13
* Time: 上午1:46
*/
class Cat{
function miau()
{
print 'miau';
}
}
class Dog{
function wuff()
{
print 'wuff';
}
}
function printTheRightSound($obj)
{
if ($obj instanceof Cat)
{
$obj->miau();
}else if($obj instanceof Dog){
$obj->wuff();
}else
{
print 'Error:Passed wrong kind of object';
}
print "\n";
}
printTheRightSound(new Cat());
printTheRightSound(new Dog());
poly.png
可以很容易的看出这个例子是不可扩展的。如果想通过增加另外三种动物来扩展的话,你可能不得不在printTheRightSound函数中增加另外的三个elseif模块一遍检查你的对象时其中哪一种新动物的实例。而且接来下还要增加代码来调用方法。
多态使用继承来解决这个问题。
<?php
/**
* 这里可以使用接口或者抽象类
* 一般情况,如果需要在父类实现一些方法的时候使用抽象类
* 所有方法都不需要实现方法体的时候使用接口
* Class Animal
*/
abstract class Animal
{
abstract function makeSound();
}
class Cat extends Animal{
function makeSound()
{
print 'miau';
}
}
class Dog extends Animal {
function makeSound()
{
print 'wuff';
}
}
function printTheRightSound($obj)
{
if ($obj instanceof Animal)
{
$obj->makeSound();
}else
{
print 'Error:Passed wrong kind of object';
}
print "\n";
}
printTheRightSound(new Cat());
printTheRightSound(new Dog());
你可能发现无论网这个例子中增加多少种动物类型。都不需要对printTheRightSound函数做任何更改。
网友评论