第十节 抽象方法和抽象类 [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如何得到当前页和上一页的地址?
Nov 27 PHP
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
php获取错误信息的方法
Jul 17 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
php文件系统处理方法小结
May 23 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
利用PHP计算有多少小于当前数字的数字方法示例
Aug 26 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
php中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
php 猴子摘桃的算法
2017/06/20 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
js仿360开机效果
2019/12/26 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
酒店管理自荐信
2013/10/23 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
结婚周年感言
2014/02/24 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
倡议书范文大全
2015/04/28 职场文书
高中同学会致辞
2015/08/01 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL