php Abstract 抽象类 与 Interface的
一、Abstract Class 与 Interface 的构造
抽象类 Abstract Class
<?php |
接口 Interface
<?php |
可以看到,Abstract Class 中可以有抽象函数(method1,method2),也可以有具体的函数实现(method3),而 Interface 中只能定义函数而不能有实现(method4,method5)。显然,如果一个抽象类中的函数全部是抽象函数,那么这个抽象类就退化成了接口。不过要注意的是
- PHP 和 Java 一样,一个 Class 只能继承一个 Abstract Class,但可以实现多个 Interface。这即是所谓的单一继承体系,也就是子类别只能继承一个父类别;一个父类别则可以被多个子类别所继承。据说在 Python 中是可以多重继承的。
- 在 Abstract Class 中可以声明属性成员变量(attribute),而 Interface 不可以。
二、举例
下面的例子可以帮助我们从另一个层面:Abstract Class 和 Interface 所反映出的设计理念,来分析一下二者的本质区别。
假设我们要定义一个关于“门”的 Class,门有“开”和“关”两个动作。此时我们既可以用 Abstract Class 也可以用 Interface 来描述这个抽象概念——
抽象类 Abstract Class
<?php |
接口 Interface
<?php |
在 Abstract Class 中并没有实现开门和关门方法,因为有的门可以用钥匙打开,有的门用密码打开,还有的门可以用指纹打开,这些具体方法就交给子类继承去实现。在这样看上去 Abstract Class 和 Interface 二者的使用没有太大差别。
现在如果定义一种具有“报警”功能的门,Abstract Class 和 Interface 描述类似——
抽象类 Abstract Class
<?php |
接口 Interface
<?php |
很明显上面的做法是不对的。它在定义中把 Door 本身固有的开门、关门的行为方法和另外一个概念“报警器”的行为方法混在了一起。有的门可以报警,而有的门可能没有报警功能;而会报警的门也可能多种多样(钥匙开门,刷卡开门等等)。我们必须将报警行为单独定义到另一个对象中,那么就有 3 种方式:
- 门和报警器都用 abstract class 方式定义;
- 门和报警器都用 interface 方式定义;
- 一个使用 abstract class 方式定义,另一个使用 interface 方式定义。
由于 PHP 中子类只可继承自一个 Abstract Class,而且 Abstract Class 不支持多重继承(abstract class cannot extend abstract class),所以第一种方式显然不行。而第二种方式则没有能够正确的揭示我们的设计意图,也就是没有反映出 AlarmDoor 在概念本质上是 Door,同时它有具有报警功能。所以对于 Door 这个概念,我们应该采取 Abstract Class 方式来定义,AlarmDoor 继承自 Door,而报警概念通过 Interface 方式定义。
<?php |
这样的实现基本上正确地反映了我们的设计意图。接口是可以多重继承的,子类也可以实现多个接口。这样就使得我们可以继续扩展门的功能,比如给门再装个摄像头……
三、结论
当我们使用 Abstract Class 的时候,我们应该定义一类对象的属性,即描述它 是什么。而 Interface 则类似于插件,侧重于提供附加的能力,约定它 能做什么。
php Abstract 抽象类 与 Interface的的更多相关文章
- Java abstract 抽象类 和interface接口的异同点
abstract 抽象类 和interface接口的异同点 相同点: 抽象类和接口都不能实例化,他们都位于继承树顶端,被其他类实现和继承 都可以包含抽象方法,实现接口或者继承抽象类的非抽象类(普通类) ...
- abstract抽象类和interface接口
一.抽象类 1.抽象类不能实例化,因为有抽象方法未实现 2.可以被抽象类或非抽象类继承 3.但不是只能被继承,还可以直接拿来使用的,当然,这个使用是拿来声明,反例如下: public abstract ...
- Java:抽象类abstract和接口Interface
一.抽象类:abstract 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情.对于一个父类,如果它的某个方法在父类中实现出来 ...
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
abstract修饰符可以修饰类和方法. (1)abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型(见后面实例),也就是编译时类型.抽象类就相当于 ...
- 《Beginning Java 7》 - 7 - abstract class 抽象类 和 interface 接口
1. 抽象类: 为什么用抽象类: 一些 generic 的类本身并没有现实意义,所以不需要被实例化.比如动物,自然界没有动物这个物种,但却有无数的继承自动物的物种,那么动物本身可以是一个抽象类. 抽象 ...
- Java abstract class 和 interface 的区别
Java abstract class 和 interface 的区别 1. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制 2. 以Door的抽象概 ...
- 深入理解abstract class和interface(转)
原文地址 深入理解abstract class和interface java提高篇(四)-----抽象类与接口
- abstract class和interface 知多少!!!
1.相同点 A. 两者都是抽象类,都不能实例化. B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法. 2. 不同点 A. interface需 ...
- 11)Java abstract class 和 interface
abstract class 和 interface 的区别 含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象.含有abstract方法的类必须定义 ...
随机推荐
- js浮点数保留位数方法封装
大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...
- Oracle执行计划总结
一.ORACLE中常见执行计划 表访问的执行计划 1.table access full:全表扫描.它会访问表中的每一条记录. 2.table access by user rowid:输入源rowi ...
- python之数据驱动Excel+ddt操作(方法二)
一.Mail163数据如下: 二.Excel+ddt代码如下: import xlrdimport unittestfrom selenium import webdriverfrom seleniu ...
- Mysql数据量较大时分页查询优化
据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是主键,vtype是int,vtype是索引. 最后co ...
- Fastjson使用示例及常见问题(九)
一.介绍 1. 什么是fastjson? fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化 ...
- C++ Socket编程(基础)
一.基本简介 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式. 通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也 ...
- odoo里的开发案例
1.模块命名[驼峰命名方法] res开头的是:resources 常见模型:res.users, res.company, res.partner, res.config.setti ...
- odoo12里定时任务
以odoo12为例: 1. 定义定时任务属性 <record id="ir_cron_submit_auto_action" model="ir.cron" ...
- 微信小程序工具下载与安装
下载 第一步:百度搜索"微信公众平台" 第二步:登录微信公众平台 第三步:点击微信开发者工具 第四步:按照自己的操作系统下载对应的版本的开发者工具,我的是Windows10 64位 ...
- 小鹤双拼win10一键恢复布局
起因 一直用的小鹤双拼布局,最近重装系统又要重新配置,麻烦 尝试 查找对应注册表设置,找到以下路径包含相应配置 HKEY_CURRENT_USER\Software\Microsoft\InputMe ...