您当前的位置: 首页 > 学无止境 > 网站建设 网站首页网站建设
燕十八面向对象-多态(天上掉下个猪八戒)
发布时间:2015-08-30 00:39:08编辑:雪饮阅读()
如下例子中模拟了多种不同颜色的手电筒的实现方式,但意外的是竟然可以将猪八戒也换到手电筒的头部处。。。。。
<?php
header("Content-type:text/html;charset=utf-8");
class light{
//开灯,传一个玻璃参数
public function ons($g){
//用玻璃渲染颜色
$g->display();
}
}
class RedGlass{
public function display(){
echo "<br/>红光照耀<br/>";
}
}
class BlueGlass{
public function display(){
echo "<br/>蓝光照耀<br/>";
}
}
class GreenGlass{
public function display(){
echo "<br/>绿光照耀<br/>";
}
}
//意外类
class Pig{
public function display(){
echo "<br/>天上掉下个猪八戒<br/>";
}
}
//创建一个手电筒
$light=new light();
//创建3块玻璃
$red=new RedGlass();
$blue=new BlueGlass();
$green=new GreenGlass();
//意外对象
$zbj=new Pig();
//变红灯
$light->ons($red);
//变蓝灯
$light->ons($blue);
//变绿灯
$light->ons($green);
//意外调用
$light->ons($zbj);
?>
手电筒上面竟然可以调用猪八戒,未免太灵活太变态,在强语言中多态是不允许这样的事故发生的,不是什么都可以换到手电筒上面的。这个例子和php中变 量一样,可以接受任何类型的值,而不单独定义值类型,就是因为这样的原因才造成多态甚至变态。和java等相比却是不叫多态,但从效果上面来讲也可以叫多 态。
为了解决此逻辑上的不合理之处,我们需要限制其手电筒更换结口处的参数类型,对其检测参数类型
<?php
header("Content-type:text/html;charset=utf-8");
class light{
//此处。仿java,也加一个类名,做参数类型检测
public function ons(RedGlass $g){
//用玻璃渲染颜色
$g->display();
}
}
class RedGlass{
public function display(){
echo "<br/>红光照耀<br/>";
}
}
class BlueGlass{
public function display(){
echo "<br/>蓝光照耀<br/>";
}
}
class GreenGlass{
public function display(){
echo "<br/>绿光照耀<br/>";
}
}
//意外类
class Pig{
public function display(){
echo "<br/>天上掉下个猪八戒<br/>";
}
}
//造手电筒
$light=new light();
//造红玻璃
$red=new RedGlass();
//早蓝玻璃
$blue=new BlueGlass();
//红灯亮
$light->ons($red);
//蓝灯亮
$light->ons($blue);
?>
加了类型检测后又只能够固定为一个玻璃类的调用,这样显然也是不行的,该代码仅仅只能够使用“红色玻璃”时运行,其它任何颜色任何对象都不可以使用。可以使用里氏代换原则。
<?php
header("Content-type:text/html;charset=utf-8");
class light{
//此处。仿java,也加一个类名,做参数类型检测
public function ons(Glass $g){
//用玻璃渲染颜色
$g->display();
}
}
class Glass{
public function display(){
}
}
class RedGlass extends Glass{
public function display(){
echo "<br/>红光照耀<br/>";
}
}
class BlueGlass extends Glass{
public function display(){
echo "<br/>蓝光照耀<br/>";
}
}
class GreenGlass extends Glass{
public function display(){
echo "<br/>绿光照耀<br/>";
}
}
//意外类
class Pig{
public function display(){
echo "<br/>天上掉下个猪八戒<br/>";
}
}
//造手电筒
$light=new light();
//造红玻璃
$red=new RedGlass();
//造蓝玻璃
$blue=new BlueGlass();
//意外对象
$zbj=new Pig();
//红灯亮
$light->ons($red);
//蓝灯亮
$light->ons($blue);
//意外调用
$light->ons($zbj);
?>
这样以来我们既可以避免意外的调用了猪八戒,而且还可以调用不同颜色的玻璃,不同颜色的玻璃都属于玻璃类,我们只需要对手电筒更换头部接口处限制为玻璃类即可。这样才实至名归的做了多态。
关键字词:燕十八,多态,个人博客