转 PHP抽象类:无法实例化 (不错)
http://blog.csdn.net/kaituozheboke/article/details/52183726
一、抽象类: 无法实例化
类前加 abstract, 此类就成为抽象类,无法实例化.
举例:
春秋战国时期,燕零七 飞行器专家,能工巧匠.他写了一份图纸---【飞行器制造术】
飞行器秘制图谱:
- 要有一个有力的发动机,喷气式.
- 要有一个平衡舵,掌握平衡
他的孙子问: 发动机怎么造呢?
燕零七眼望夕阳: 我是造不出来,但我相信后代有人造出来
- // 燕零七的构想,当时的科技造不出来,即这个类只能在图纸化,无法实例化.
- // 此时这个类没有具体的方法去实现,还太抽象.
- // 因此我们把他做成一个抽象类
- abstract class FlyIdea {
- // 大力引擎,当时也没法做,这个方法也实现不了
- // 因此方法也是抽象的
- public abstract function engine();
- // 平衡舵
- public abstract function blance();
- /*
- ----------------------注意:抽象方法 不能有方法体,写到小括号就行了----------------------
- 下面这样写是错误的(有方法体)
- public abstract function blance() {
- }
- Fatal error: Abstract function FlyIdea::engine() cannot contain body
- */
- }
- /*
- ----------------------抽象类不能 new 来实例化----------------------
- 下面这行是错误的
- $kongke = new FlyIdea();
- Cannot instantiate abstract class FlyIdea
- */
- // ------------1----------到了明朝,万户用火箭解决了发动机的问题----------------------
- abstract class Rocket extends FlyIdea {
- // 万户把engine方法,给实现了,不再抽象了
- public function engine() {
- echo '点燃火药,失去平衡,嘭!<br />';
- }
- // 继承自父类,但是万户实现不了平衡舵,(还有一个抽象方法)
- // 因此平衡舵对于Rocket类来说,
- // 还是抽象的,
- // 类也是抽象的 因此类加一个abstract
- }
- /*
- ------------1----------到了现代,燕十八亲自制作飞行器----------------------
- 这个Fly类中,所以抽象方法,都已经实现了,不再是梦想.
- */
- class Fly extends Rocket{
- public function engine() {
- echo '有力一扔<br />';
- }
- public function blance() {
- echo '两个纸翼保持平衡~~~';
- }
- public function start() {
- $this->engine();
- for($i=0;$i<10;$i++) {
- $this->blance();
- echo '平稳飞行<br />';
- }
- }
- }
- $apache = new Fly();
- $apache->start();
- /*有力一扔
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行
- 两个纸翼保持平衡~~~平稳飞行*/
- //有一个类是抽象的,但是里面的方法不是抽象的,能否new?
- /*
- 但是 --- 即便全是具体方法,但类是抽象的,
- 也不能实例化.*/
- abstract class Car {
- public function run() {
- echo '滴滴';
- }
- }
- //$qq = new qq(); 不能实例化
- //解决办法》》》继承
- class qq extends Car {
- }
- $qq = new qq();
总结:
类前加 abstract 是抽象类
方法前加 abstract 是抽象方法
抽象类 不能 实例化
抽象方法 不能有 方法体
有抽象方法,则此类必是 抽象类
抽象类,内未必有抽象方法
但是 --- 即便全是具体方法,但类是抽象的,
也不能实例化.
二、抽象类的意义
请看如下场景:
Facebook 多国语言欢迎页面
user登陆,有一个 c 字段,是其国家
当各国人登陆时,看到各国语言的欢迎界面
我们可以用面向过程的来做
- $c = 'english';
- if($c == 'china') {
- echo '你好,非死不可';
- } else if($c =='english') {
- echo 'hi,welcome';
- } else if($c == 'japan') {
- echo '搜达斯内';
- }
反思: 当facebook进入泰国市场时,
增加 else if ,扩展性很差
=====用面向对象来做======
让美国小组/中国开发组/斯蜜达开发组 来开发Welcome类
争执不下: echo 到底该中? 日? 韩?
说: 干脆在wel()方法里,判断一下? 没意义啊
- abstract class Welcome {
- public abstract function wel();
- }
- // 这是首页的controller开发者
- //$wel = new Welcome();
- //$wel->wel();
- /*
- 说:你们别争执了,我只知道,我要调用wel()方法,就是打招呼,
- 你们显示什么语言和我无关.
- */
- /**
- 经理说话:
- Welcome谁也不许动,各国开发小组开发自己的招呼类
- 另:为了首页的controller开发者便于调用,
- 统一继承自welcome类
- **/
- class china extends Welcome {
- public function wel() {
- echo '你好,非死不可,<br />';
- }
- }
- class english extends Welcome {
- public function wel() {
- echo 'hi,welcome';
- }
- }
- class japan extends Welcome {
- public function wel() {
- echo '搜达斯奈';
- }
- }
- // 再看首页开发者
- $c = 'english'; // china, japan
- $wel = new $c();
- $wel->wel();
- /*
- 以后新增了泰国语,首页的开发者,根本无需改动
- 只需要增加一个泰国的welcome类 就可以了.
- 所以有一些面向对象的介绍中,说面向对象的一个特点:可插拔特性
- */
转 PHP抽象类:无法实例化 (不错)的更多相关文章
- PHP中的特殊类,接口类和抽象类(都不能直接实例化)
接口类不用实例化,需要一一实现接口定义的所有方法.关键字interface implements 接口interface 是一个规定,给人继承用的东西,有点像抽象类在里面定义的方法,却不去实例化,而需 ...
- java 抽象类为什么不能被实例化?
我把CSDN论坛里面的一个帖子内容list到下面,自己看着理解,东家一言,西家一语,杂合起来,基本上也就理解了java中的抽象类为什么不能被实例化了. 因篇幅有限,只能罗列部分留言 以下内容不分先后顺 ...
- java基础之抽象类与接口的区别
在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...
- java面向对象(三)之抽象类,接口,向上转型
java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能 ...
- Java入门(一)——类、抽象类和接口
Java是一门面向对象语言,可以看出"对象"在Java有着举足轻重的位置.那么,"对象"从何而来呢?那必须是丈母娘造出来的,下面我们就先来说说这个丈母娘--类. ...
- java抽象类和接口
面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物. ...
- java基础1.-------抽象类,抽象方法
抽象类:抽象类不能实例化,类中的方法必须经过子类的重写实现 类里的方法是public修饰时,子类可重写也可不重写 类的方法是abstract修饰时,方法是抽象方法,子类必须重写该方法 类的方法用fin ...
- 浅谈我对C#中抽象类与接口的理解
C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...
- c#接口与抽象类的区别
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...
随机推荐
- 搜索学术论文訪问google的能用的几个IP地址
google搜索引擎打不开时的解决的方法,谷歌(google)的IP是多少? google IP镜像. 这里搜集了几个经过測试可用的IP,用来在不能域名訪问google的时候进行訪问 更新一个最新的. ...
- GCC编译动态和静态链接库例子
我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...
- git 删除目录
1. 查看本地已经被删除的文件 2. 删除 目录以及目录下的文件 [root@test01 h2_mopub_replace]# git rm ../test_code_driver -r 3. [r ...
- CodeForces 300C Beautiful Numbers(乘法逆元/费马小定理+组合数公式+高速幂)
C. Beautiful Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- cocos2d-x中锚点设置及定位方式
问题 在cocos2d演示样例代码HelloCpp中,为什么要将CCMenu设置位置到CCPointZero,即使CCMenu的锚点是在(0.5, 0.5)? 回答 这是由于CCMenu没有使用锚点进 ...
- linux document and directory find
http://suchalin.blog.163.com/blog/static/55304677201062924959497/ Linux 查看文件夹大小及文件数量命令 2010-07-29 14 ...
- Form content types
Forms in HTML documents https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4 17.13.4 Form con ...
- VisualSVN Server的配置和使用
VisualSVN Server的配置与使用 本版本为VisualSVN Server 2.7.3版本-不同的版本可能在设置有不同的差异,但都大同小异 1.1启动界面 安装好 VisualSVN Se ...
- TS数据流PAT和PMT分析(转载)
转自:http://www.cnblogs.com/hjj801006/p/3837435.html TS流,是基于packet的位流格式,每个packet是188个字节或者204个字 节(一般是18 ...
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...