第十节 抽象方法和抽象类 [10]


Posted in PHP onOctober 09, 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
<?php
//abstract root class 抽象根类
abstract class Shape
{
abstract function getArea(); file://定义一个抽象方法
}

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

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

public function getArea() file://覆写计算面积方法
{
return(($this->base * $this->height)/2);
}

public function getNumberOfSides() file://覆写边数统计方法
{
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(); file://建立形状的集合,放入数组

//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) file://如果$s是Shape类的实例
{
print("Area: " . $s->getArea() .
"<br>n");
}

if($s instanceof Polygon)
{
print("Sides: " .
$s->getNumberOfSides() .
"<br>n");
}

if($s instanceof Color)
{
print("Color: $s->name<br>n");
}

print("<br>n");
}

?>

PHP 相关文章推荐
利用PHP和AJAX创建RSS聚合器的代码
Mar 13 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
php实现的错误处理封装类实例
Jun 20 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 PHP
PHP判断是否是json字符串
Apr 01 PHP
Extended CHM PHP 语法手册之 DIY
Oct 09 #PHP
使用PHP制作新闻系统的思路
Oct 09 #PHP
一个oracle+PHP的查询的例子
Oct 09 #PHP
为php4加入动态flash文件的生成的支持
Oct 09 #PHP
用PHP编程语言开发动态WAP页面
Oct 09 #PHP
用PHP读注册表
Oct 09 #PHP
用PHP调用数据库的存贮过程
Oct 09 #PHP
You might like
php中取得URL的根域名的代码
2011/03/23 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
js闭包实例汇总
2014/11/09 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
分享Python字符串关键点
2015/12/13 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
Python bytes string相互转换过程解析
2020/03/05 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
计算机专业推荐信范文
2013/11/27 职场文书
学校班班通实施方案
2014/06/11 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
童年读书笔记
2015/06/26 职场文书
销售会议开幕词
2016/03/04 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle