通过具体程序来理解PHP里面的抽象类


Posted in PHP onJanuary 28, 2010

当然,可能存在多个根类,用来实现不同的功能. 在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用. 如果我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继承出来的子类合作.

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

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

声明抽象方法的语法与声明一般方法不同. 抽象方法的没有像一般方法那样包含在大括号{}中的主体部份,并用分号;来结束.
在下面的程序文件中, 我们定义了一个含有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中的抽象方法) 
*/ 
<?php //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) print("Area: ".$s->getArea()."<br>\n"); //如果$s是Shape类的实例 
if($s instanceof Polygon) print("Sides: ".$s->getNumberOfSides()."<br>\n"); 
if($s instanceof Color) print("Color:".$s->name."<br>\n"); 
print("<br>\n"); 
} 
?>

运行结果:
Area: 35
Sides: 4
Area: 10
Sides: 3
Area: 28.274333882308
Color:blue
PHP 相关文章推荐
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
PHP正则验证Email的方法
Jun 15 PHP
php通过淘宝API查询IP地址归属等信息
Dec 25 PHP
php文件管理基本功能简单操作
Jan 16 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
Aug 11 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
详解no input file specified 三种解决方法
Nov 29 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 PHP
认识并使用PHP超级全局变量
Jan 26 #PHP
php 静态变量与自定义常量的使用方法
Jan 26 #PHP
php学习之 认清变量的作用范围
Jan 26 #PHP
PHP 变量的定义方法
Jan 26 #PHP
php cout&amp;lt;&amp;lt;的一点看法
Jan 24 #PHP
php addslashes和mysql_real_escape_string
Jan 24 #PHP
PHPMailer 中文使用说明小结
Jan 22 #PHP
You might like
php获取目标函数执行时间示例
2014/03/04 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
键盘控制事件应用教程大全
2006/11/24 Javascript
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
python中的句柄操作的方法示例
2019/06/20 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
python实现简单井字棋游戏
2020/03/04 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
Pycharm中如何关掉python console
2020/10/27 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
给医院的感谢信
2015/01/21 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
使用python创建股票的时间序列可视化分析
2022/03/03 Python
Python集合set()使用的方法详解
2022/03/18 Python
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android