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下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
PHP里的中文变量说明
Jul 23 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
php程序内部post数据的方法
Mar 31 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
php多线程并发实现方法
Sep 30 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
Laravel Reponse响应客户端示例详解
Sep 03 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
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
Javascript之文件操作
2007/03/07 Javascript
用JavaScript调用WebService的示例
2008/04/07 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
详解Python中的条件判断语句
2015/05/14 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
对Django url的几种使用方式详解
2019/08/06 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
python无序链表删除重复项的方法
2020/01/17 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
python def 定义函数,调用函数方式
2020/06/02 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
董事长秘书岗位职责
2013/11/29 职场文书
投标邀请书范文
2014/01/31 职场文书
高中物理教学反思
2014/02/08 职场文书
创先争优个人总结
2015/03/04 职场文书
教师考核鉴定意见
2015/06/05 职场文书