http://blog.csdn.net/kaituozheboke/article/details/52183726

一、抽象类: 无法实例化


类前加 abstract, 此类就成为抽象类,无法实例化.

举例:

春秋战国时期,燕零七 飞行器专家,能工巧匠.他写了一份图纸---【飞行器制造术】

飞行器秘制图谱:

  • 要有一个有力的发动机,喷气式.
  • 要有一个平衡舵,掌握平衡

他的孙子问: 发动机怎么造呢?

燕零七眼望夕阳: 我是造不出来,但我相信后代有人造出来

  1. // 燕零七的构想,当时的科技造不出来,即这个类只能在图纸化,无法实例化.
  2. // 此时这个类没有具体的方法去实现,还太抽象.
  3. // 因此我们把他做成一个抽象类
  4. abstract class FlyIdea {
  5. // 大力引擎,当时也没法做,这个方法也实现不了
  6. // 因此方法也是抽象的
  7. public abstract function engine();
  8. // 平衡舵
  9. public abstract function blance();
  10. /*
  11. ----------------------注意:抽象方法 不能有方法体,写到小括号就行了----------------------
  12. 下面这样写是错误的(有方法体)
  13. public abstract function blance() {
  14. }
  15. Fatal error: Abstract function FlyIdea::engine() cannot contain body
  16. */
  17. }
  18. /*
  19. ----------------------抽象类不能 new 来实例化----------------------
  20. 下面这行是错误的
  21. $kongke = new FlyIdea();
  22. Cannot instantiate abstract class FlyIdea
  23. */
  24. // ------------1----------到了明朝,万户用火箭解决了发动机的问题----------------------
  25. abstract class Rocket extends FlyIdea {
  26. // 万户把engine方法,给实现了,不再抽象了
  27. public function engine() {
  28. echo '点燃火药,失去平衡,嘭!<br />';
  29. }
  30. // 继承自父类,但是万户实现不了平衡舵,(还有一个抽象方法)
  31. // 因此平衡舵对于Rocket类来说,
  32. // 还是抽象的,
  33. // 类也是抽象的 因此类加一个abstract
  34. }
  35. /*
  36. ------------1----------到了现代,燕十八亲自制作飞行器----------------------
  37. 这个Fly类中,所以抽象方法,都已经实现了,不再是梦想.
  38. */
  39. class Fly extends Rocket{
  40. public function engine() {
  41. echo '有力一扔<br />';
  42. }
  43. public function blance() {
  44. echo '两个纸翼保持平衡~~~';
  45. }
  46. public function start() {
  47. $this->engine();
  48. for($i=0;$i<10;$i++) {
  49. $this->blance();
  50. echo '平稳飞行<br />';
  51. }
  52. }
  53. }
  54. $apache = new Fly();
  55. $apache->start();
  56. /*有力一扔
  57. 两个纸翼保持平衡~~~平稳飞行
  58. 两个纸翼保持平衡~~~平稳飞行
  59. 两个纸翼保持平衡~~~平稳飞行
  60. 两个纸翼保持平衡~~~平稳飞行
  61. 两个纸翼保持平衡~~~平稳飞行
  62. 两个纸翼保持平衡~~~平稳飞行
  63. 两个纸翼保持平衡~~~平稳飞行
  64. 两个纸翼保持平衡~~~平稳飞行
  65. 两个纸翼保持平衡~~~平稳飞行
  66. 两个纸翼保持平衡~~~平稳飞行*/
  67. //有一个类是抽象的,但是里面的方法不是抽象的,能否new?
  68. /*
  69. 但是 --- 即便全是具体方法,但类是抽象的,
  70. 也不能实例化.*/
  71. abstract class Car {
  72. public function run() {
  73. echo '滴滴';
  74. }
  75. }
  76. //$qq = new qq();   不能实例化
  77. //解决办法》》》继承
  78. class qq extends Car {
  79. }
  80. $qq = new qq();

总结:

  类前加 abstract 是抽象类

方法前加 abstract 是抽象方法

抽象类 不能 实例化

抽象方法 不能有 方法体

有抽象方法,则此类必是 抽象类

抽象类,内未必有抽象方法

但是 --- 即便全是具体方法,但类是抽象的,

也不能实例化.

二、抽象类的意义


请看如下场景:

Facebook 多国语言欢迎页面

user登陆,有一个 c 字段,是其国家

当各国人登陆时,看到各国语言的欢迎界面

我们可以用面向过程的来做

  1. $c = 'english';
  2. if($c == 'china') {
  3. echo '你好,非死不可';
  4. } else if($c =='english') {
  5. echo 'hi,welcome';
  6. } else if($c == 'japan') {
  7. echo '搜达斯内';
  8. }

反思: 当facebook进入泰国市场时,

增加 else if ,扩展性很差

=====用面向对象来做======

让美国小组/中国开发组/斯蜜达开发组 来开发Welcome类

争执不下: echo 到底该中? 日? 韩?

说: 干脆在wel()方法里,判断一下? 没意义啊

    1. abstract class Welcome {
    2. public abstract function wel();
    3. }
    4. // 这是首页的controller开发者
    5. //$wel = new Welcome();
    6. //$wel->wel();
    7. /*
    8. 说:你们别争执了,我只知道,我要调用wel()方法,就是打招呼,
    9. 你们显示什么语言和我无关.
    10. */
    11. /**
    12. 经理说话:
    13. Welcome谁也不许动,各国开发小组开发自己的招呼类
    14. 另:为了首页的controller开发者便于调用,
    15. 统一继承自welcome类
    16. **/
    17. class china extends Welcome {
    18. public function wel() {
    19. echo '你好,非死不可,<br />';
    20. }
    21. }
    22. class english extends Welcome {
    23. public function wel() {
    24. echo 'hi,welcome';
    25. }
    26. }
    27. class japan extends Welcome {
    28. public function wel() {
    29. echo '搜达斯奈';
    30. }
    31. }
    32. // 再看首页开发者
    33. $c = 'english'; // china, japan
    34. $wel = new $c();
    35. $wel->wel();
    36. /*
    37. 以后新增了泰国语,首页的开发者,根本无需改动
    38. 只需要增加一个泰国的welcome类 就可以了.
    39. 所以有一些面向对象的介绍中,说面向对象的一个特点:可插拔特性
    40. */

转 PHP抽象类:无法实例化 (不错)的更多相关文章

  1. PHP中的特殊类,接口类和抽象类(都不能直接实例化)

    接口类不用实例化,需要一一实现接口定义的所有方法.关键字interface implements 接口interface 是一个规定,给人继承用的东西,有点像抽象类在里面定义的方法,却不去实例化,而需 ...

  2. java 抽象类为什么不能被实例化?

    我把CSDN论坛里面的一个帖子内容list到下面,自己看着理解,东家一言,西家一语,杂合起来,基本上也就理解了java中的抽象类为什么不能被实例化了. 因篇幅有限,只能罗列部分留言 以下内容不分先后顺 ...

  3. java基础之抽象类与接口的区别

    在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...

  4. java面向对象(三)之抽象类,接口,向上转型

    java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能 ...

  5. Java入门(一)——类、抽象类和接口

    Java是一门面向对象语言,可以看出"对象"在Java有着举足轻重的位置.那么,"对象"从何而来呢?那必须是丈母娘造出来的,下面我们就先来说说这个丈母娘--类. ...

  6. java抽象类和接口

    面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物.     ...

  7. java基础1.-------抽象类,抽象方法

    抽象类:抽象类不能实例化,类中的方法必须经过子类的重写实现 类里的方法是public修饰时,子类可重写也可不重写 类的方法是abstract修饰时,方法是抽象方法,子类必须重写该方法 类的方法用fin ...

  8. 浅谈我对C#中抽象类与接口的理解

    C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...

  9. c#接口与抽象类的区别

    abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...

随机推荐

  1. 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三

    用CSS画小猪佩奇,你就是下一个社会人!   欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯 ...

  2. soapUI系列之—-04 问题解决 获取接口返回报文response报错

    1. SoapUI+Groovy中"org.apache.xmlbeans.XmlException: error: Unexpected element: CDATA" 通过So ...

  3. Unity5.1 新的网络引擎UNET(八) UNET 系统概括

     孙广东   2015.7.12 Server and Host 在Unity 的 网络系统,游戏有 一个server和多个client. 当没有专用的server时,client之中的一个扮演s ...

  4. myeclipse包的层数和package的层数不一致

    复制别人的工程的时候常常遇到包的层数不一致的情况 如下图 其实com.weibo.happpy.dao的上面还有一层java包,但是代码里没有写java....... 可以通过如下方式修改工程:

  5. Koa2学习(九)与mongoDB交互

    Koa2学习(九)与mongoDB交互 数据库下载与安装 windows下载地址:http://dl.mongodb.org/dl/win32/x86_64 linux下载地址:https://www ...

  6. GET 与 POST 的理解

    1 HTTP请求      超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信.      HTTP 的工作方式是客户机与服务器之间的请求-应答协议.      比如,客户端(浏览器) ...

  7. java生成随机汉字

    方法一: public static char getRandomChar() { return (char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0 ...

  8. bzoj3330: [BeiJing2013]分数

    口胡 题目hint都给你是一个三分函数了 还不会上三分套三分吗 exp函数又卡 精度又卡 什么sb毒瘤题 浪费时间

  9. YTU 2852: 二分查找

    2852: 二分查找 时间限制: 1 Sec  内存限制: 128 MB 提交: 215  解决: 79 题目描述 输入不多于20个升序排列的整数,以及一个待查找的数key,输出key在序列中的位置( ...

  10. idea新建springmvc+spring+mybaties项目1

    1,点击file,选择module,新建项目 2,选择maven -- >maven-archetype-webapp 3,输入GroupId,ArtifactId,点击next 4,选择本地m ...