PHP5.0对象模型探索之抽象方法和抽象类


Posted in PHP onSeptember 05, 2006

面向对象程序通过类的分层结构构建起来,在单重继承语言如PHP中,类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类。当然,可能存在多个根类,用来实现不同的功能。在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用。如果我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继承出来的子类合作。

抽象方法是就像子类中一般的方法的占位符(占个地方但不起作用),它与一般方法不同—没有任何代码。如果类中存在一个或更多抽象方法, 那么这个类就成了抽象类。你不能实例化抽象类. 你必须继承它们,然后实例化子类,你也可以把抽象类看成是子类的一个模板。

如果你覆写所有的抽象方法,子类就变成一个普通的类。如果没有覆写所有方法, 子类仍是抽象的. 如果一个类中中包含有抽象方法(哪怕只有一个), 你必须声明这个类是抽象的, 在class关键字前加上abstract。

声明抽象方法的语法与声明一般方法不同,抽象方法的没有像一般方法那样包含在大括号{}中的主体部份,并用分号;来结束。

在例子6.13中,我们定义了一个含有getArea方法的类Shape。但由于不知道形状不可能确定图形的面积,确良我们声明了getArea方法为抽象方法。你不能实例化一个Shape对象,但你可以继承它或在一个表达式中使用它,就像例6.13中那样。

如果你建立了一个只有抽象方法的类,你就定义了一个接口(interface)。为了说明这种情况,PHP中有interface 和implements关键字。你可以用interface来代替抽象类,用implements来代替extends来说明你的类定义或使用一个接口,例如, 你可以写一个myClass implements myIterface. 这两种方法可以依个人偏爱来选择。

/*注:
两种方法即指:
1. abstract class aaa{} (注意aaa中只有抽象方法,没有一般方法)
class bbb extends aaa{} (在bbb中覆写aaa中的抽象方法)
2. interface aaa{}
class bbb implements aaa{} (在bbb中覆写aaa中的抽象方法)
*/

Listing 6.13 Abstract classes

//abstract root class 抽象根类
abstract class Shape
{
 abstract function getArea(); //定义一个抽象方法
}

//abstract child class 抽象子类
abstract class Polygon extends Shape //多边形
{
 abstract function getNumberOfSides();
}

//concrete class 实体类 三角形类
class Triangle extends Polygon
{
 public $base;
 public $height;

 public function getArea() //覆写计算面积方法
 {

return(($this->base * $this->height)/2);
 }

 public function getNumberOfSides() //覆写边数统计方法
 {

return(3);
 }
}

//concrete class 实体类四边形
class Rectangle extends Polygon
{
 public $width;
 public $height;

 public function getArea()
 {

return($this->width * $this->height);
 }

 public function getNumberOfSides()
 {

return(4);
 }
}

//concrete class 实体类 圆形
class Circle extends Shape
{
 public $radius;

 public function getArea()
 {

return(pi() * $this->radius * $this->radius);
 }
}

//concrete root class 定义一个颜色类
class Color
{
 public $name;
}

$myCollection = array(); //建立形状的集合,放入数组

//make a rectangle
$r = new Rectangle;
$r->width = 5;
$r->height = 7;
$myCollection[] = $r;
unset($r);

//make a triangle
$t = new Triangle;
$t->base = 4;
$t->height = 5;
$myCollection[] = $t;
unset($t);

//make a circle
$c = new Circle;
$c->radius = 3;
$myCollection[] = $c;
unset($c);

//make a color
$c = new Color;
$c->name = "blue";
$myCollection[] = $c;
unset($c);

foreach($myCollection as $s)
{
 if($s instanceof Shape) //如果$s是Shape类的实例
 {

print("Area: " . $s->getArea() . "n");
 }

 if($s instanceof Polygon)
 {

print("Sides: " .$s->getNumberOfSides()."n");
 }

 if($s instanceof Color)
 {

print("Color: $s->name n");
 }

 print("n");
}

?>

PHP 相关文章推荐
默默小谈PHP&MYSQL分页原理及实现
Jan 02 PHP
apache+php+mysql安装配置方法小结
Aug 01 PHP
PHP之数组学习
May 29 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
php旋转图片90度的方法
Nov 07 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
php导出生成word的方法
Dec 25 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
Feb 18 PHP
简单谈谈 php 文件锁
Feb 19 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
PHP 5.0对象模型深度探索之绑定
Sep 05 #PHP
PHP中的串行化变量和序列化对象
Sep 05 #PHP
Windows下的PHP5.0安装配制详解
Sep 05 #PHP
PHP.MVC的模板标签系统(五)
Sep 05 #PHP
PHP.MVC的模板标签系统(四)
Sep 05 #PHP
PHP.MVC的模板标签系统(三)
Sep 05 #PHP
PHP.MVC的模板标签系统(二)
Sep 05 #PHP
You might like
php的大小写敏感问题整理
2011/12/29 PHP
php使用百度天气接口示例
2014/04/22 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
JavaScript自执行闭包的小例子
2013/06/29 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
高中体育教学反思
2014/01/24 职场文书
护士求职自荐信范文
2014/03/19 职场文书
县级文明单位申报材料
2014/05/23 职场文书
护理专科学生自荐书
2014/07/05 职场文书
七年级地理教学计划
2015/01/22 职场文书
个人德育工作总结
2015/03/05 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL